为什么C中的以下内容非法?
y = (w + x)++;
根据我的书,这是非法的,但我不明白为什么。
答案 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-value,w+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
,这是非法的。