Несколько символов в символьной константе - PullRequest
10 голосов
/ 04 августа 2011

Некоторые компиляторы C допускают использование нескольких символов в символьной константе. Это означает, что написание «да» вместо «да» вполне может остаться незамеченным. Источник: C ловушек и ловушек

Может ли кто-нибудь привести пример, когда допускается использование нескольких символов в символьной константе?

Ответы [ 3 ]

15 голосов
/ 04 августа 2011

Как процитировал Code Monkey, это определяется реализацией, а реализация варьируется - это не просто разница между BigEndian / LittleEndian и charset.Я протестировал четыре реализации (все с использованием ASCII) с программой

#include <stdio.h>

int main()
{
    unsigned value = 'ABCD';
    char* ptr = (char*)&value;

    printf("'ABCD' = %02x%02x%02x%02x = %08x\n", ptr[0], ptr[1], ptr[2], ptr[3], value);
    value = 'ABC';
    printf("'ABC'  = %02x%02x%02x%02x = %08x\n", ptr[0], ptr[1], ptr[2], ptr[3], value);
    return 0;
}

и получил четыре разных результата

Big endian (AIX, POWER, IBM compiler)

'ABCD' = 41424344 = 41424344
'ABC'  = 00414243 = 00414243

Big endian (Solaris, Sparc, компилятор SUN)

'ABCD' = 44434241 = 44434241
'ABC'  = 00434241 = 00434241

Little endian (Linux, x86_64, gcc)

'ABCD' = 44434241 = 41424344
'ABC'  = 43424100 = 00414243

Little endian (Solaris, x86_64, компилятор Sun)

'ABCD' = 41424344 = 44434241
'ABC'  = 41424300 = 00434241
8 голосов
/ 04 августа 2011

Думаю, вы могли бы использовать его в выражении case, но я бы не стал его рекомендовать.

'yes' - константа с несколькими символами.Его тип int, а его значение зависит от реализации.Итак, как вы уже сказали, дело за компилятором.

так что int foo = 'yes';

ARM, раздел 2.5.2, стр. 9:

"Символьная константа - это один или несколько символов, заключенных в одинарные кавычки, как в 'x'."

Позже на той же странице:

"Мультихарактерконстанты имеют тип int. Значение константы, состоящей из нескольких символов, зависит от реализации. Например, можно ожидать, что значение 'AB' будет 'A' 'B' и ('A' << 8) + 'B' втри различных реализации. Обычно лучше избегать констант из нескольких символов. "</p>

и

Цитирование из спецификации ANSI C (с которой C ++ делает некоторую попытку совместимости):

3.1.3.4 Семантика символьных констант

Целочисленная константа charcter имеет тип int [обратите внимание, что она имеет тип char в C ++] ... Значение целочисленной символьной константы, содержащей более одного символа... определяется реализацией.

5 голосов
/ 04 августа 2011

Многосимвольные константы разрешены во всех контекстах, где допускаются односимвольные константы.

Что касается того, где они будут фактически использоваться, я видел код, который использует многосимвольные константы для создания разборчивых уникальных значений. Например, предполагая, что int составляет 4 байта, «ABCD» и «EFGH», вероятно, будут различаться. (Это не гарантируется языком; реализация должна документировать сопоставление, но это не обязательно должно быть разумным.) При условии разумного сопоставления вы, скорее всего, увидите «ABCD» или «EFGH» в объектном коде. Не лучшая идея в мире, но она может сработать, если вас не волнует мобильность.

Кстати, все соответствующие C компиляторы поддерживают многосимвольные константы (по определению; компилятор, который их не поддерживает, не соответствует).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...