Несколько символов в символьной константе
Некоторые компиляторы 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 поддерживают многосимвольные константы (по определению; компилятор, который их не поддерживает, не соответствует).