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

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