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

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

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

Как цитирует Code Monkey, это реализация определена, и ее реализация меняется – это не просто разница BigEndian / LittleEndian и charset. Я протестировал четыре реализации (все с использованием ASCII) с программой

#include  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 

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

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

  • Что делает флаг FD_CLOEXEC fcntl ()?
  • После K & R, какую книгу можно использовать для обучения программированию на простом C?
  • Почему запись в строковый литерал в этой программе C segfault?
  • Как проверить, соответствует ли значение строке
  • Может ли sizeof (int) когда-либо быть 1 в размещенной реализации?
  • Многократное наследование Objective-C
  • Почему деление приводит к нулю вместо десятичного?
  • Почему sizeof (param_array) - размер указателя?
  • Почему мы не можем использовать двойной указатель для представления двухмерных массивов?
  • Альтернативный (K & R) C синтаксис для объявления функции против прототипов
  • Когда рекомендуется использовать strdup (vs malloc / strcpy)
  • Давайте будем гением компьютера.