Как уже упоминалось в других ответах, '/0'
не является нулевым символом завершения, '\0'
- это.
Можно ожидать, что указание более одного символа в символьном литерале может привести к ошибке; к сожалению (по крайней мере, в этом случае) C допускает использование «многосимвольных» литеральных символов, но точное поведение многосимвольных литералов определяется реализацией (6.4.4.4/2 «Символьные константы»):
Целочисленная символьная константа имеет тип int. Значение целочисленной символьной константы, содержащей один символ, который отображается на однобайтовый исполнительный символ, является числовым значением представления сопоставленного символа, интерпретируемого как целое число. Значение целочисленной символьной константы, содержащей более одного символа (например, 'ab'), или содержащей символ или escape-последовательность, которая не отображается на однобайтовый символ выполнения, определяется реализацией.
Таким образом, ваш '/0'
'символ' в конечном итоге становится неким значением int, определяемым реализацией, которое усекается при сохранении в d[2]
. Ваш компилятор может сгенерировать предупреждение для многосимвольных литералов, но это, вероятно, также будет зависеть от конкретных параметров, которые вы предоставляете компилятору.
Например, я получаю следующее предупреждение от GCC (у меня установлена опция -Wall):
C:\temp\test.cpp:6:14: warning: multi-character character constant
В моих тестах с MSVC и MinGW значение '/0'
равно 0x00002f30
, поэтому d[2] = '/0'
в итоге эквивалентно d[2] = '0'
.