Comments 13
"Мульти-символьные символьные литералы"- это даже звучит как оксюморон.
Мне давно интересно, зачем их вообще в язык добавили и кто их использовал.
+4
cppreference говорит, что они остались как наследие языка B.
SvyatoslavMC, встречали ли вы такие константы в проектах, которые проверяли с PVS-Studio?
0
Сейчас работаю с кодом проекта Haiku OS. Там нашлось около сотни таких мест.
0
UFO just landed and posted this here
Причем тут это? Вы путаете запись числа и представление в памяти в зависимости от big или little endian систем. Число 0xA1A2 на всех типах систем всегда должно быть равным 41378, вне зависимости от порядка байт в памяти, все остальное это ошибки программиста.
+1
А зачем они их переворачивают? Получается только у VC++ в одном случае(если всё за ecape'ить) строка останется в памяти в том же порядке.
0
for (int i = sizeof(lit); i--;)
Оно задумано «в обратном порядке» и только GCC/Clang делают то, что попросили.
Не. Основная логика то здесь:
printf("%c", *ptr++);
И тогда действительно становится жутко…
0
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++ это конечно не объясняет.
0
Помнится в одной из статей PVS (и, кажется, даже, не одной) проскакивал лозунг: не сокращайте код, компилятор умнее и сам сделает как надо. И тут в статье вижу:
Объединить условие и декремент — это здорово, красиво и свежо, однако противоречит вашим же базовым принципам, а кроме того еще и опасно: если переменная при инициализации примет отрицательное значение, то будет бяка (я не про sizeof в конкретном примере, а про выстрелы себе в ногу людей, которые примут на вооружение подобный bad-practice-код).
Еще пример:
Я смотрю на код и пытаюсь понять: мы инкрементируем поинтер или значение, на которое он ссылается? Дай-ка я возьму сейчас учебник и найду: приоритетнее разыменование или инкремент?
Я точно читаю статью от PVS?
for (int i = sizeof(lit); i--;)
Объединить условие и декремент — это здорово, красиво и свежо, однако противоречит вашим же базовым принципам, а кроме того еще и опасно: если переменная при инициализации примет отрицательное значение, то будет бяка (я не про sizeof в конкретном примере, а про выстрелы себе в ногу людей, которые примут на вооружение подобный bad-practice-код).
Еще пример:
printf("%c", *ptr++);
Я смотрю на код и пытаюсь понять: мы инкрементируем поинтер или значение, на которое он ссылается? Дай-ка я возьму сейчас учебник и найду: приоритетнее разыменование или инкремент?
Я точно читаю статью от PVS?
0
а про выстрелы себе в ногу людей, которые примут на вооружение подобный bad-practice-кодНу так мы в основном и специализируемся на публикации bad-practice-кода :D
0
(del)
0
Sign up to leave a comment.
Опасность использования multi-character-констант