Как уже отмечали другие, поведение равно undefined , потому что выражение 7+"%c"
не указывает на элемент в массиве или один за концом массива. См. Онлайн-стандарт языка C, черновик n1256 , & sect; 6.5.6 и пункт; 8 для деталей.
По совпадению ваши строки располагаются в памяти примерно так (используя воображаемый начальный адрес):
Address 0x00 0x01 0x02 0x03
------- ----------------------
0x00008000 '%' 'c' 0 's'
0x00008004 'u' 'n' 'd' 'a'
0x00008008 'r' 'a' 'm' 0
«% c» начинается с 0x00008000, а «sundaram» начинается с 0x000080003.
Когда вы звоните
printf(7+"%c", "sundaram");
выражение массива "% c" преобразуется из типа char [3]
в char *
, а его значением является адрес первого элемента в массиве или 0x00008000. Таким образом, выражение 7+"%c"
оценивается как 7 + 0x00008000 или 0x00008007. Строка, которая начинается с 0x00008007, является "арам".
Поскольку «aram» не содержит спецификаторов преобразования, второй аргумент («sundaram», который оценивается как 0x00008003) оценивается, но в противном случае игнорируется (& sect; 7.19.6.1, & para; 2).
Поскольку поведение не определено, возможен любой результат; этот конкретный результат не гарантированно произойдет с другим компилятором или с другими настройками компилятора.