7

为什么以下在 C 中是非法的?

y = (w + x)++;

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

4

7 回答 7

21

i++中, 的发生了i变化。执行后,i的值是其先前值的一加。但是,您不能在 中存储值w+x,因此您不能执行以下任何操作,所有这些(如果它们有效)都会或多或少产生相同的效果:

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

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

于 2013-10-09T14:39:30.747 回答
8

根据 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中阅读有关可修改左值的信息

于 2013-10-09T14:43:11.767 回答
5

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

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

于 2013-10-09T14:40:10.197 回答
4

这是非法的,因为(w+x)它不是合法的左侧值。

左侧值是可以分配给的值(即变量)。

于 2013-10-09T14:38:49.353 回答
3

后增量需要一个l-value,但w+x事实并非如此。

于 2013-10-09T14:39:49.750 回答
2

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

考虑

a++a = a + 1

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

于 2013-10-09T14:43:00.330 回答
2

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

于 2013-10-09T14:43:35.093 回答