Согласно стандарту C (6.5.2 операторы Postfix) оператор индекса определяется следующим образом
postfix-expression [ expression ]
Поэтому перед квадратными скобками должно стоять постфиксное выражение.
В этом выражении
x = -1[p];
используется постфиксное выражение 1
(которое одновременно является первичным выражением), постфиксное выражение 1[p]
(то есть оператор индексации) и унарный оператор -
. Учтите, что когда компилятор разбивает программу на токены, тогда целочисленные константы считаются самими токенами без минуса. минус - это отдельный жетон.
Таким образом, заявление можно переписать как
x = -( 1[p] );
потому что постфиксное выражение имеет более высокий приоритет, чем унарное выражение.
Рассмотрим сначала постфиксное подвыражение 1[p]
Согласно стандарту C (6.5.2.1 индексирование массива)
2 Постфиксное выражение, за которым следует выражение в квадратных скобках [], является индексированным обозначением элемента объекта массива. Определение оператора индекса [] заключается в том, что E1 [E2] идентично (* ((E1) + (E2))). Из-за правил преобразования, которые применяются к бинарному оператору +, если E1 является объектом массива (эквивалентно указателем на начальный элемент объекта массива), а E2 является целым числом, E1 [E2] обозначает E2-й элемент E1 (отсчет с нуля).
Таким образом, это подвыражение оценивается как *( ( 1 ) + ( p ) )
и совпадает с *( ( p ) + ( 1 ) ).
Таким образом, приведенное выше заявление
x = -1[p];
эквивалентно
x = -p[1];
и даст -3
, потому что указатель p
указывает на второй элемент массива из-за оператора
int *p = &array[1];
а затем выражение p[1]
возвращает значение элемента после второго элемента массива. Затем применяется унарный оператор -
.
person
Vlad from Moscow
schedule
14.08.2019
-(p[1])
, то же самое, что-(array[2])
. - person Eugene Sh.   schedule 14.08.2019a[5] == 5[a]
. Но если вы также не запомнили менее интуитивные правила приоритета C, или если вы не помните, что C рассматривает-1
как приложение унарного оператора минус (вместо того, чтобы рассматривать его как отдельный токен и внутренне отрицательную константу ), вас могут ввести в заблуждение, если вы подумаете, что-1[p]
- это то же самое, чтоp[-1]
, а не-(p[1])
. - person zwol   schedule 14.08.2019-p[1]
попытался бы отрицать указатель ... - person Antti Haapala   schedule 14.08.2019a[5] == 5[a]
как дубликат, но на самом деле он охватывает только половину этого вопроса. Я бы сказал, что удивительный приоритет здесь не менее важен. - person Steve Summit   schedule 14.08.2019-(1[p])
или-p[1]
, если это не было очевидно. - person S.S. Anne   schedule 15.08.2019