理解C中的增量运算符

时间:2013-10-09 14:36:54

标签: c syntax lvalue

为什么C中的以下内容非法?

y = (w + x)++;

根据我的书,这是非法的,但我不明白为什么。

7 个答案:

答案 0 :(得分:21)

i++中,i已更改。执行后,i的值为1加上之前的值。但是,您无法在w+x中存储值,因此您无法执行以下任何操作,所有这些操作(如果有效)将具有或多或少相同的效果:

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

可以放在作业左侧的东西通常称为左值 l 用于)。这种简洁的说法是++只能应用于左值,而w+x不是左值。您可以在此问题及其答案中阅读有关左值(以及其他类型值)的更多信息:

答案 1 :(得分:8)

根据Dennis M. Ritchie的书:"The C Programming Language"

  

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); and j = ++(i & i); should an error: lvalue?

从(1)Expression must be a modifiable lvalue error和(2)msdn docs:Lvalues and Rvalues

了解可修改的左值

答案 2 :(得分:5)

y = x++返回变量x的增量值。

y = (x + z)++失败,因为(x + z)不是变量。

答案 3 :(得分:4)

这是非法的,因为(w+x)不是合法的左手边价值。

左侧值是可以分配给(I.E.变量)的值。

答案 4 :(得分:3)

后增量需要l-valuew+x不是。

答案 5 :(得分:2)

这是非法的,因为(x+y)不是变量。

考虑

a++a = a + 1

(x+y)++是什么? (x+y) = (x+y) + 1

答案 6 :(得分:2)

发布信息和递减需要l-value(比如左侧的变量)。 w+x不是变量。增加w+x就像增量3 + 4,这是非法的。