Вопрос: Я наткнулась на шуточный код, содержащий "выражение" 5["abcdef"].
Почему такие выражения возможны в С?

Ответ:

Да, Вирджиния, индекс и имя массива можно переставлять в С.
Этот забавный факт следует из определения индексации через указатель, а именно, a[e] идентично *((a)+(e)), для любого выражения е и основного выражения а, до тех пор пока одно из них будет указателем, а другое целочисленным выражением.
Эта неожиданная коммутативность часто со странной гордостью упоминается в С-текстах, но за пределами
Соревнований по Непонятному Программированию (Obfuscated C Contest) она применения не находит. (см. вопрос 17.13).

Смотри: ANSI Rationale Разд. 3.3.2.1 c. 41.
Автор: Кодт    Оценить