Как стать автором
Обновить

Комментарии 13

"Мульти-символьные символьные литералы"- это даже звучит как оксюморон.
Мне давно интересно, зачем их вообще в язык добавили и кто их использовал.

cppreference говорит, что они остались как наследие языка B.


SvyatoslavMC, встречали ли вы такие константы в проектах, которые проверяли с PVS-Studio?

Сейчас работаю с кодом проекта Haiku OS. Там нашлось около сотни таких мест.
НЛО прилетело и опубликовало эту надпись здесь
Причем тут это? Вы путаете запись числа и представление в памяти в зависимости от big или little endian систем. Число 0xA1A2 на всех типах систем всегда должно быть равным 41378, вне зависимости от порядка байт в памяти, все остальное это ошибки программиста.

Но число 41387 будет разной последовательностью байтов на be и le

А зачем они их переворачивают? Получается только у VC++ в одном случае(если всё за ecape'ить) строка останется в памяти в том же порядке.

Наоборот же:
for (int i = sizeof(lit); i--;)

Оно задумано «в обратном порядке» и только GCC/Clang делают то, что попросили.


Не. Основная логика то здесь:
printf("%c", *ptr++);

И тогда действительно становится жутко…

Выше подсказали ответ:


Multicharacter constants were inherited by C from the B programming language. Although not specified by the C standard, compilers implement multicharacter constants as specified in B: the values of each char in the constant initialize successive bytes of the resulting integer, in big-endian zero-padded right-adjusted order, e.g. the value of '\1' is 0x00000001 and the value of '\1\2\3\4' is 0x01020304.

Соответственно строка '\1\2\3\4' переводится в число 0x01020304 а порядок байт чисел в памяти уже зависит от процессора. В данном случае ('GHIJ' : JIHG) это Little Endian. Но случай с VC++ это конечно не объясняет.

Помнится в одной из статей PVS (и, кажется, даже, не одной) проскакивал лозунг: не сокращайте код, компилятор умнее и сам сделает как надо. И тут в статье вижу:
  for (int i = sizeof(lit); i--;)

Объединить условие и декремент — это здорово, красиво и свежо, однако противоречит вашим же базовым принципам, а кроме того еще и опасно: если переменная при инициализации примет отрицательное значение, то будет бяка (я не про sizeof в конкретном примере, а про выстрелы себе в ногу людей, которые примут на вооружение подобный bad-practice-код).
Еще пример:
printf("%c", *ptr++);

Я смотрю на код и пытаюсь понять: мы инкрементируем поинтер или значение, на которое он ссылается? Дай-ка я возьму сейчас учебник и найду: приоритетнее разыменование или инкремент?

Я точно читаю статью от PVS?
а про выстрелы себе в ногу людей, которые примут на вооружение подобный bad-practice-код
Ну так мы в основном и специализируемся на публикации bad-practice-кода :D
… а также объясняете его проблемы и приводите правильный вариант.
Здесь же раскрывается суть одной проблемы и неявно сверху закладывается еще парочка.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий