【发布时间】:2013-10-09 14:36:53
【问题描述】:
为什么下面的 C 语言是非法的?
y = (w + x)++;
根据我的书,这是非法的,但我不明白为什么。
【问题讨论】:
为什么下面的 C 语言是非法的?
y = (w + x)++;
根据我的书,这是非法的,但我不明白为什么。
【问题讨论】:
在i++ 中,i 的值 已更改。执行后,i 的值是其先前值的一加。但是,您不能在 w+x 中存储值,因此您不能执行以下任何操作,所有这些(如果它们有效)都会或多或少产生相同的效果:
w+x = w+x+1;
w+x += 1;
(w+x)++;
可以放置在赋值左侧的东西通常称为lvalue(l 代表left)。简而言之,++ 只能应用于左值,而w+x 不是左值。您可以在此问题及其答案中阅读有关左值(和其他类型的值)的更多信息:
【讨论】:
根据 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); 编译时会产生左值错误。阅读:j = ++(i | i); and j = ++(i & i); should an error: lvalue?
从 (1) Expression must be a modifiable lvalue error 和 (2) msdn 文档中了解可修改的左值:Lvalues and Rvalues
【讨论】:
a[i]++ 和 (*p)++。但是,说“我们不能修改表达式的 [值]”是不对的,因为变量也是表达式,其他左值也是。
++(*p)++ 这是左值错误:) 而++*p++ 不是
++*p++ 在做什么到底是什么?增加了什么?什么指针被尊重?之后增加了什么?我不确定没有测试,但我希望它编译后,它正在执行 (p = p+1),然后执行 ++(*p)。
++*p++ 等价于++*p; p++; 第一个由p 寻址的值递增,然后p 本身递增以指向下一个位置。注意++*p++的括号版本是:++(*(p++));
y = x++ 返回变量x 的增量值。
y = (x + z)++ 失败,因为(x + z) 不是变量。
【讨论】:
这是非法的,因为(w+x) 不是合法的左侧值。
左侧值是可以分配给(即变量)的值。
【讨论】:
后增量需要l-value,w+x 不需要。
【讨论】:
post/prefix incremented and decrements也想分享一个链接:Expression must be a modifiable lvalue error
这是非法的,因为(x+y) 不是变量。
考虑
a++ 是a = a + 1
(x+y)++是什么? (x+y) = (x+y) + 1?
【讨论】:
后递增和递减需要l-value(比如左侧的变量)。 w+x 不是变量。递增w+x 就像递增3 + 4,这是非法的。
【讨论】: