Рассмотрим следующий фрагмент кода.
#include <iostream>
int main(){
int a[] = {1,2,3,4,5};
int b = 5;
std::cout << a[b] << std::endl;
std::cout << b[a] << std::endl;
}
Я понимаю, что a[b]
и b[a]
идентичны, как указано в стандарте:
За исключением случаев, когда он был объявлен для класса (13.5.5 ), оператор индекса [] интерпретируется таким образом, что E1 [E2] идентично * ((E1) + (E2)). Из-за правил преобразования, которые применяются к +, если E1 - это массив, а E2 - целое число, то E1 [E2] относится к E2-му члену E1. Поэтому, несмотря на его асимметричный вид c, индексирование - это коммутативная операция.
Однако я все еще не совсем понимаю. Компилятор адресует арифметику c в байтах. Поскольку int занимает 4 байта, и a[b]
, и b[a]
преобразуются в *(a + b * 4)
. У меня вопрос: как компилятор определяет, что правильный перевод *(a + b * 4)
вместо *(b + a * 4)
? Когда компилятору дается выражение в форме E1[E2]
, компилятор может преобразовать его либо в *(E1 + E2 * 4)
, либо в *(E2 + E1 * 4)
- как компилятор узнает, какое из них правильное?