Несколько символов в символьной константе
Некоторые компиляторы C допускают несколько символов в символьной константе. Это означает, что запись "да" вместо "да" вполне может остаться незамеченной. Источник: C ловушки и подводные камни
Может ли кто-нибудь привести пример этого, если в символьной константе разрешено несколько символов?
Ответы
Ответ 1
Как цитируется 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;
}
и я получил четыре разных результата
Большой endian (компилятор AIX, POWER, IBM)
'ABCD' = 41424344 = 41424344
'ABC' = 00414243 = 00414243
Большой endian (Solaris, Sparc, SUN-компилятор)
'ABCD' = 44434241 = 44434241
'ABC' = 00434241 = 00434241
Маленький endian (Linux, x86_64, gcc)
'ABCD' = 44434241 = 41424344
'ABC' = 43424100 = 00414243
Маленький endian (Solaris, x86_64, компилятор Sun)
'ABCD' = 41424344 = 44434241
'ABC' = 41424300 = 00434241
Ответ 2
Вы могли бы использовать его в случае case, я думаю, но я бы не рекомендовал его.
'yes'
- многохарактерная константа. Его тип int
, и его значение зависит от реализации. Так, как вы уже сказали, это до компилятора.
so int foo = 'yes';
ARM, раздел 2.5.2, стр. 9:
"Символьная константа - это один или несколько символов, заключенных в один цитаты, как в" x".
Позже на той же странице:
"Множественные константы имеют тип int. Значение a зависимость от многозадачности зависит от реализации. Например, значение" AB "можно было бы разумно ожидать" A "" B "и ('A' < 8) + 'B' на трех различных реализациях. Multicharacter обычно лучше избегать констант".
и
Цитата из спецификации ANSI C (к которой С++ делает попытку быть совместимой):
3.1.3.4 Семантика констант символов
Целочисленная константа charcter имеет тип int [обратите внимание, что она имеет тип charв С++]... Значение целочисленной символьной константы, содержащей больше чем один символ... определяется реализацией.
Ответ 3
Многосимвольные константы разрешены во всех контекстах, где допускаются односимвольные константы.
Что касается того, где они были бы использованы, я видел код, который использует многосимвольные константы для создания четких уникальных значений. Например, если предположить, что int составляет 4 байта, "ABCD" и "EFGH", вероятно, будут отличаться. (Это не гарантируется языком, реализация должна документировать сопоставление, но это не должно быть разумным.) И, предполагая разумное сопоставление, вы, скорее всего, увидите "ABCD" или "EFGH" в объектном коде. Не лучшая идея в мире, но она может работать, если вам не все равно о переносимости.
Кстати, все соответствующие C-компиляторы поддерживают многосимвольные константы (по определению: компилятор, который их не поддерживает, не соответствует).