研究后,我发现增量运算符要求操作数具有可修改的数据对象:https://en.wikipedia.org/wiki/Increment_and_decrement_operators。
由此推测,它会导致编译错误,因为(a+b)
是一个临时整数,因此无法修改。
这个理解正确吗?这是我第一次尝试研究问题,如果我应该寻找什么,请指教。
研究后,我发现增量运算符要求操作数具有可修改的数据对象:https://en.wikipedia.org/wiki/Increment_and_decrement_operators。
由此推测,它会导致编译错误,因为(a+b)
是一个临时整数,因此无法修改。
这个理解正确吗?这是我第一次尝试研究问题,如果我应该寻找什么,请指教。
这只是一个规则而已,可能存在的原因有(1)使编写C编译器更容易,(2)没有人说服C标准委员会放宽此规定。
通俗来说,只有当foo
可以出现在类似于foo = bar
的赋值表达式的左边时,才能编写++foo
。因为你不能编写a + b = bar
,所以也不能编写++(a + b)
。
实际上并没有什么理由阻止a + b
产生一个临时变量来执行++
操作,其结果就是表达式++(a + b)
的值。
++
有时会具有修改某些内容的副作用,而有时又不会,那么将会非常令人困惑。 - aschepler你说得对。 ++
尝试将新值赋给原始变量,所以 ++a
将获取 a
的值,加上 1
并将其重新分配给 a
。正如你所说,(a+b)是一个临时值,而不是具有分配的内存地址的变量,因此无法执行赋值操作。
x = y * 3
在汇编伪代码中,它可能看起来像这个玩具示例:
load register A with the value at memory address y
load register B with a value of 3
multiply register A and B, saving the result in A
write register A to memory address x
跟随维基百科的参考资料将带您进入Dennis Ritchie(“K&R C”中的“R”)有关C语言历史的有趣写作,这里为了方便而链接:http://www.bell-labs.com/usr/dmr/www/chist.html,您可以搜索“++”。(Ken Thompson)的观察结果是++x的翻译比x = x + 1的翻译更小。
(a+b)
不是左值,因此不允许应用增量运算符。显然,如果表达式++E等同于(E+=1)。
E
不是左值,则无法编写E += 1
。这很遗憾,因为可以说:“将E增加一”并完成。在这种情况下,在非左值上应用运算符(原则上)是完全可能的,但代价是使编译器稍微复杂一些。(a+b)
的结果很可能是您根本无法增加的东西,或者增加可能具有非常重要的副作用(不仅仅是添加1)。编译器必须能够应对此,并在出现问题的情况下进行诊断。在左值上,这仍然相当简单。对于任何一种你向可怜的东西扔进括号内的杂乱表达式,情况就不是这样了。++试图将值赋给原始变量,由于(a+b)是临时值,无法执行操作。这些基本上是C编程约定的规则,以使编程更加简单。就是这样。
表达式(a+b)的值是一个右值,不能被递增。
当执行 ++(a+b) 表达式时,举个例子:
int a, b;
a = 10;
b = 20;
/* NOTE :
//step 1: expression need to solve first to perform ++ operation over operand
++ ( exp );
// in your case
++ ( 10 + 20 );
// step 2: result of that inc by one
++ ( 30 );
// here, you're applying ++ operator over constant value and it's invalid use of ++ operator
*/
++(a+b);
c = a + b + 1
更清晰且输入更短时,为什么您还想要这样做。增减运算符实现了两种操作:1.它们和它们的参数组成一个表达式(可以在for循环等中使用),2.它们修改参数。在您的示例中,您正在使用属性1,但不是属性2,因为您扔掉了修改后的参数。如果您不需要属性2,只想要表达式,则可以直接编写表达式,例如x+1,而不是x++。 - Trevor