Как оценивается оператор приращения в C программах? - PullRequest
0 голосов
/ 19 апреля 2020

У меня есть два выражения:

int a=5; 
int c=++a;// c=6, a=6
int b=a++;// b=6, a=7

Во второй инструкции сначала оценивается приращение, а в третьей инструкции приращение оценивается после присваивания.

Я знаю, что оператор приращения имеет более высокий приоритет. Может кто-нибудь объяснить мне, почему он оценивается после назначения в третьем выражении?

Ответы [ 2 ]

5 голосов
/ 19 апреля 2020

Результат связан не с порядком операций, а с определением префикса ++ и постфикса ++.

. Выражение ++a соответствует увеличенному значению a. Напротив, выражение a++ соответствует значению current , равному a, а a увеличивается как побочный эффект.

Раздел 6.5.2.4p2 из C стандарт говорит о следующем постфиксе ++:

Результатом оператора постфикса ++ является значение операнда. Как побочный эффект, значение объекта операнда увеличивается (то есть к нему добавляется значение 1 соответствующего типа).

И в разделе 6.5.3.1p2 говорится о префиксе следующее ++:

Значение операнда оператора префикса ++ увеличивается. Результатом является новое значение операнда после увеличения. Выражение ++E эквивалентно (E+=1)

0 голосов
/ 19 апреля 2020

++a и a++ - это просто разные операторы, несмотря на один и тот же символ ++. Один из них - префиксный прирост, другой - постфиксный прирост. Это не имеет ничего общего с приоритетом по сравнению с назначением. (точно так же, как a - b и -a являются разными операторами, несмотря на один и тот же символ -.)

РЕДАКТИРОВАТЬ: Было отмечено, что это примерно C, а не C ++ ... упс Таким образом, следующее объяснение может сбить с толку, если вы знаете только C; все, что вам нужно знать, это то, что int& является ссылкой на int, так что это похоже на указатель, но без необходимости разыменовывать его, поэтому изменение a внутри этих функций фактически изменяет переменную, которую вы передали в функции.

Вы можете представить их как функции:

int prefixIncrement(int& a) {
  return ++a;
}

... - это то же самое, что:

int prefixIncrement(int& a) {
  a += 1;
  return a;
}

И:

int postfixIncrement(int& a) {
  return a++;
}

... совпадает с:

int postfixIncrement(int& a) {
  int old = a;
  a += 1;
  return old;
}

Для придирки: Да, на самом деле нам нужно переместить семантику на возвращаемое значение для postfixIncrement.

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