为什么以下在 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,这是非法的。