C++代码片段的无动于衷的行为
Indifferent behavior of C++ code snippet
请考虑以下代码片段
int a,i;
a = 5;
(i++) = a;
(++i) = a;
cout<<i<<endl;
第 (++i) = a
行编译正确并给出 5 作为输出。
但是(i++) = a
error: lvalue required as left operand of assignment
给出了编译错误。
我找不到这种冷漠行为的原因。如果有人解释这一点,我将不胜感激。
表达式 i++
计算增量操作之前的 i
值。该值是临时值(即右值),不能分配给它。
++i
之所以有效,是因为该表达式在递增后计算结果为 i
,并且可以将i
赋值(它是一个左值)。
更多关于维基百科上的左值和右值。
根据C++标准,前缀++
是一个左值(它与 C) 不同),修复后编号。 更一般地说,C++需要任何改变左值的东西的观点参数,并将该参数的值作为其值,结果为左值。 所以++ i
是一个左值(因为结果值是 i
的新值),但i ++
不是(因为结果值不是新值,而是旧值)。
当然,所有这些都是为了内置++
运算符。 如果你重载,这取决于重载的签名(但是正确设计的重载++
的行为类似于内置的)。
当然,既不(++ i) = a;
也不(i ++) = a;
在你的例子是合法的;两者都使用未初始化的值变量 ( i
),这是未定义的行为,并且都修改i
两次,没有中间序列点。
相关文章: