Рассмотрим этот пример:
struct {
int num;
} s, *ps;
s.num = 0;
ps = &s;
++ps->num;
printf("%d", s.num); /* Prints 1 */
Он печатает 1
.
Итак, я понимаю, что это потому, что в соответствии с приоритетом операторов, ->
выше, чем ++
, поэтому сначала выбирается значение ps->num
(равное 0), а затем оператор ++
работает с ним, поэтому он увеличивается это к 1.
struct {
int num;
} s, *ps;
s.num = 0;
ps = &s;
ps++->num;
printf("%d", s.num); /* Prints 0 */
В этом примере я получаю 0
, и я не понимаю, почему; объяснение первого примера должно быть таким же для этого примера. Но кажется , что это выражение оценивается следующим образом:
Сначала оператор ++
работает, и он работает на ps
, поэтому он увеличивает его до следующего struct
. Только тогда ->
работает и ничего не делает, потому что просто выбирает поле num
следующего struct
и ничего с ним не делает.
Но это противоречит приоритетности операторов, которые говорят, что ->
имеют более высокий приоритет, чем ++
.
Может кто-нибудь объяснить это поведение?
Редактировать
После прочтения двух ответов, которые ссылаются на таблицы приоритетов C ++, в которых указано, что префиксные операторы ++
/ --
имеют более низкий приоритет, чем ->
, я немного погуглил и нашел эту ссылку , в которой говорится что это правило применяется также к самому С. Это точно и полностью объясняет это поведение, но я должен добавить, что таблица в этой ссылке противоречит таблице в моей собственной копии K & R ANSI C. Поэтому, если у вас есть предложения относительно того, какой источник является правильным, я хотел бы знать.
Спасибо.