Понимание оператора приращения в C

Почему следующее незаконно в C?

y = (w + x)++;

Согласно моей книге, это незаконно, но я не понимаю, почему.

7 ответов

Решение

В i++, стоимость i изменено После исполнения iзначение равно единице его предыдущего значения. Вы не можете сохранить значение в w+xТем не менее, и поэтому вы не можете выполнить ни одного из следующих действий, которые все (если бы они работали) имели бы более или менее одинаковый эффект:

w+x = w+x+1;
w+x += 1;
(w+x)++;

Что-то, что может быть размещено слева от назначения, обычно называется lvalue (l - для левого). Краткий способ сказать, что это ++ может применяться только к lvalues, и w+x не lvalue Вы можете прочитать больше о lvalues ​​(и других видах значений) в этом вопросе и его ответах:

Согласно книге Денниса М. Ричи: "Язык программирования C":

2.8 Операторы инкремента и декремента

(страница 44)

Операторы увеличения и уменьшения могут применяться только к переменным; выражение как (i + j)++ незаконно Операнд должен быть modifiable lvalue арифметического или указательного типа.

Потому что выражение

i++;

эквивалентно:

i = i + 1;

Так что выражение вроде:

(i + j)++;

что-то вроде эквивалента:

(i + j) =  (i + j) + 1;  // meaning less

Это выглядит менее значимым, мы не можем изменить выражение.

Связанный: интересная ошибка, о которой можно узнать в gcc 4.4.5, это выражение j = ++(i | i); компилирует, что должно выдавать ошибку l-значения. Читать: j = ++(i | i); а также j = ++(i & i); должна быть ошибка: lvalue?

Прочитайте об изменяемом lvalue из (1) Выражение должно быть изменяемой ошибкой lvalue и (2) документами msdn: Lvalues ​​и Rvalues

y = x++ возвращает значение приращения переменной x,

y = (x + z)++ не удается, потому что (x + z) НЕ является переменной

Это незаконно, потому что (w+x) не является допустимым левосторонним значением.

Значение левой стороны - это значение, которое может быть назначено (т.е. переменная).

Постинкремент требует L-значение, которое w+x не является.

Post inctrement и декремент требует l-value (скажем, переменная, которая находится на левой стороне). w+x не является переменной Приращение w+x это как увеличение 3 + 4, что является незаконным.

Это незаконно, потому что (x+y) не является переменной

Рассматривать

a++ является a = a + 1

(x+y)++ это что? (x+y) = (x+y) + 1?

Другие вопросы по тегам