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

c

19550 просмотра

3 ответа

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

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

Автор: Chankey Pathak Источник Размещён: 12.11.2019 09:04

Ответы (3)


15 плюса

Решение

Как процитировал 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
Автор: AProgrammer Размещён: 04.08.2011 04:38

8 плюса

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

'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 ++] ... Значение константы целочисленных символов, содержащей более одного символа ... определяется реализацией.

Автор: user195488 Размещён: 04.08.2011 04:07

5 плюса

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

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

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

Автор: Keith Thompson Размещён: 04.08.2011 06:59
Вопросы из категории :
32x32