为什么以下在 C 中是非法的?
y = (w + x)++;
根据我的书,这是非法的,但我不明白为什么。
在i++
中, 的值发生了i
变化。执行后,i
的值是其先前值的一加。但是,您不能在 中存储值w+x
,因此您不能执行以下任何操作,所有这些(如果它们有效)都会或多或少产生相同的效果:
w+x = w+x+1;
w+x += 1;
(w+x)++;
可以放在赋值左侧的东西通常称为左值(l代表left)。简洁的说法是++
只能应用于左值,而w+x
不是左值。您可以在此问题及其答案中阅读有关左值(和其他类型的值)的更多信息:
根据 Dennis M. Ritchie 的书:“The C Programming Language”:
2.8 递增和递减运算符
(第 44 页)
递增和递减运算符只能应用于变量;like 表达式
(i + j)++
是非法的。操作数必须是modifiable lvalue
算术或指针类型。
因为一个表达式
i++;
相当于:
i = i + 1;
所以像这样的表达式:
(i + j)++;
类似于:
(i + j) = (i + j) + 1; // meaning less
那看起来意义不大,我们不能修改表达式。
相关:在 gcc 4.4.5 中可能想知道的一个有趣的错误是表达式j = ++(i | i);
编译应该产生左值错误。阅读:j = ++(i | i);
并且j = ++(i & i);
应该出现错误:左值?
从 (1) Expression must be a modifiable lvalue error and (2) msdn docs: Lvalues and Rvalues中阅读有关可修改左值的信息
y = x++
返回变量的增量值x
。
y = (x + z)++
失败,因为(x + z)
不是变量。
这是非法的,因为(w+x)
它不是合法的左侧值。
左侧值是可以分配给的值(即变量)。
后增量需要一个l-value,但w+x
事实并非如此。
这是非法的,因为(x+y)
它不是变量。
考虑
a++
是a = a + 1
(x+y)++
是什么?(x+y) = (x+y) + 1
?
后增量和减量需要l-value
(比如左侧的变量)。w+x
不是变量。递增w+x
就像 incrementig 3 + 4
,这是非法的。