Понимание оператора приращения в 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)
не является допустимым левосторонним значением.
Значение левой стороны - это значение, которое может быть назначено (т.е. переменная).
Post inctrement и декремент требует l-value
(скажем, переменная, которая находится на левой стороне). w+x
не является переменной Приращение w+x
это как увеличение 3 + 4
, что является незаконным.
Это незаконно, потому что (x+y)
не является переменной
Рассматривать
a++
является a = a + 1
(x+y)++
это что? (x+y) = (x+y) + 1
?