[英]Understanding the increment operator in C
为什么以下代码在C中是非法的?
y = (w + x)++;
根据我的书,这是非法的,但我不明白为什么。
在i++
,的值 i
被改变。 执行后, i
的值为1加上其先前的值。 但是,您无法在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页)
递增和递减运算符只能应用于变量。
(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);
和j = ++(i & i);
应该有一个错误:左值?
阅读有关(1) 表达式必须是可修改的左值错误和(2)msdn docs 的可修改左值的信息 : 左值和右值
y = x++
返回变量x
的增量值。
y = (x + z)++
失败,因为(x + z)
不是变量。
这是非法的,因为(w+x)
不是合法的左侧值。
左侧值是可以分配给的值(即变量)。
后增量需要一个l值 ,而w+x
不是。
这是非法的,因为(x+y)
不是变量。
考虑
a++
是a = a + 1
(x+y)++
是什么? (x+y) = (x+y) + 1
?
增量和减量后需要l-value
(例如左侧的变量)。 w+x
不是变量。 w+x
的增量就像增量ig 3 + 4
,这是非法的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.