Для начала код недействителен. В этом вызове
printf("%d", strlen(S -> S + 5) + S -> S[3]);
вместо% d должен использоваться спецификатор преобразования %zu
, поскольку выражение strlen(S -> S + 5) + S -> S[3]
имеет тип size_t из-за обычных арифметических преобразований.
Во времяНа этапе предварительной обработки эти две строки
"123\0""45678"
объединяются в одну строку, например
"123\00045678"
, где \ 000 - один символ в восьмеричной записи.
Итак, это выражение
strlen(S -> S + 5)
возвращает длину подстроки "5678"
, равной 4.
Это подвыражение
S -> S[3]
возвращает символ '\000'
.
Итак, 4 + 0
дает 4
, которое выводится.