Почему 2 [a] может пройти компиляцию, если только объявить int a [3] в C - PullRequest
2 голосов
/ 21 апреля 2011

Почему 2 [a] можно скомпилировать, если только объявить int a [3] в C.

 1  #include <stdio.h>
 2
 3  int main(int argc, char **argv)
 4  {
 5      int a[3] = {1, 2, 3};
 6      printf("a[2] is: %d\n", a[2]);
 7      printf("2[a] is: %d\n", 2[a]);
 8
 9      return 0;
10  }

А на выходе оба 3, как это объяснить?

Ответы [ 3 ]

12 голосов
/ 21 апреля 2011

Потому что a[2] - это просто синтаксический сахар для *(a+2), который совпадает с *(2+a) или 2[a].

3 голосов
/ 21 апреля 2011

Поскольку все a[2] означает, что в C это *(a + 2), и поэтому *(2 + a) работает так же хорошо, что также может быть записано 2[a].

2 голосов
/ 21 апреля 2011

Выражение состоит из одного или нескольких операндов.Самая простая форма выражения состоит из одной литеральной константы или объекта.В общем случае результатом является значение r операнда.

Согласно стандарту C:

6.5.2.1 Массив с подпиской

2Выражение постфикса, за которым следует выражение в квадратных скобках [], является подписанным обозначением элемента объекта массива.Определение оператора индекса [] заключается в том, что E1 [E2] идентична (* ((E1) + (E2))).Из-за правил преобразования, которые применяются к бинарному оператору +, если E1 является объектом массива (эквивалентно указателю на начальный элемент объекта массива), а E2 является целым числом, E1 [E2] обозначает E2-й элементE1 (считая с нуля).

Итак, a[b] эквивалентно *(a+b) и b[a].где a и b могут быть любым выражением.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...