Ссылаясь на выдержку из кода:
printf("%s",&(sizeof 2[a])[a]);
Во-первых, большинство людей не осознают этого, но оператор []
на самом деле коммутативный. a[b]
эквивалентно *(a + b)
, что эквивалентно *(b + a)
, что эквивалентно b[a]
.
То есть 2[a]
эквивалентно a[2]
. Поскольку a
имеет тип const char []
, размер элемента такой же, как у sizeof(char)
, что равно 1.
Итак, теперь у нас есть:
printf("%s",&1[a]);
Ну, 1[a]
эквивалентно a[1]
или *(a + 1)
. Применение оператора address-of дает &a[1]
или a + 1
(обратите внимание, что &*x
это просто x
).
Итак, у нас есть:
printf("%s", a + 1);
Это просто печатает строку, на которую указывает a + 1
, то есть все после первого символа a
.
Если вы просто переставите операторы []
, ничего не делая, вы увидите, что это эквивалентно:
printf("%s", &a[sizeof a[2]]);