Страницы

Поиск по вопросам

четверг, 18 октября 2018 г.

странный синтаксис

очень неясно как работает данный код
int a[] = {4, 5, 2, 3, 1}; int i = *a;
for (;i;) { std::cout << i--[a]; // не понятная строчка }
// output: 1325
к чему тут декремент применяется???
ну, очевидно, что к переменной i, раз цикл завершается.
Но как тогда происходят обращения к элементам массива ? почему нет ошибки компиляции ?
Впервый раз в жизни встречаю подобный код


Ответ

Декремент тут применяется i хотя бы просто потому, что больше он в данной записи ни к чему применяться не может - справа от него стоит лексема [, которая началом выражения-операнда быть никак не может.
Тема же эквивалентности a[i] и i[a] заезжена донельзя. Выражение x[y] по определению является лишь сокращенной формой записи для *(x + y). Один операнд должен быть массивом/указателем, а другой - целочисленным или enum значением. Причем ограничений на порядок указания операндов не накладывается. Поэтому ваше i--[a] эквивалентно *(i-- + a) эквивалентно *(a + i--) и эквивалентно a[i--]. Никакой "ошибки компиляции" тут нет.
Вышесказанное относится именно и только к встроенному оператору []. Для перегруженного оператора [] порядок аргументов фиксирован, то есть для выражения x[y] будет рассматриваться только перегруженный вариант x.operator[](y), но не y.operator[](x)

Комментариев нет:

Отправить комментарий