Несколько символов в символьной константе

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

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

3 ответа

Решение

Как процитировал 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)

'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

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

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

так int foo = 'yes';

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

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

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

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

а также

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

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

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

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

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

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

Другие вопросы по тегам