当我执行这个程序时:
#include<iostream>
using namespace std;
int main(){
int x=5,y=9;
if(++x=y++){
cout<<"Works "<<x;
}
else{
cout<<"No";
}
return 0;
}
它工作正常,输出为:Works 9
但如果我执行:
#include<iostream>
using namespace std;
int main(){
int x=5,y=9;
if(x++=y++){
cout<<"Works "<<x;
}
else{
cout<<"No";
}
return 0;
}
它说: 在函数'int main()'中: 6:11:错误:左值作为赋值的左操作数 如果(X ++ = Y ++){
答案 0 :(得分:5)
因为x++
不是左值。
更具体地说,x++
增加x
,然后返回原始值为x
的临时。临时对象不能(在一旁可以使用可疑的合法性)在作业的左侧使用,因此它不是左值。
++x
递增x
并返回对x
的引用(带有新值)。如果您选择,您可以直接分配给它,因此它是一个左值。
但是,您可能实际上想要比较两个表达式是否相等,而不是进行赋值。在这种情况下,您需要使用==
而不是=
。
答案 1 :(得分:2)
你必须记住,后缀增量运算符在增量之前返回旧值。
这个值是一个非常临时的值,并且与所有其他临时值一样,它不是&#34;左值&#34;,即它不是可以分配给它的东西。
前缀增量运算符执行增量操作,然后返回对新值的引用。对于++x
,它会返回对x
的引用。它是&#34;左值&#34;。
同样适用于减量(--
)运算符。
互联网上有很多来源可以帮助你理解&#34; lvalues&#34;和&#34; rvalues&#34; (临时对象)。
答案 2 :(得分:1)
正如其他人所解释的那样,x++
的值是一个临时值,包含x
的旧值,并且临时值不能分配给。{1}}。因此,编译器拒绝代码,因为它不符合C ++的语法。
您遇到的问题是第一个示例也是错误的。虽然++x
在语法上是左值,但如果将其放在赋值运算符的左侧,则您将x
和分配给x
,而且目前尚不清楚你的意图是什么。 C ++ 89和C具有序列点的概念,如果你修改相同的变量两次没有插入序列点 - 程序的行为没有定义(任何可能发生 - 包括替换整个函数return
或段错误)。
C ++ 11引入了一个我不熟悉的不同术语,但在这种情况下的效果是相同的 - 你的第一个例子是未定义的行为。
答案 3 :(得分:0)
x ++返回x,然后递增x。另一方面,++ x递增x,然后返回它。
第二种情况是有道理的; x正在返回,你可以做任何事情。第一种情况完全没有意义; x ++不是一个值。事实上,一旦你找回了价值,x就不再是那个价值了。
答案 4 :(得分:0)
根据运算符优先级添加一些括号,以查看发生了什么:
(++x) = (y++)
这增加x,递增y并将y-1(增量前的y的前一个值)赋给x(y ++计算为y,因为它是后增量)
(x++)=(y++)
这不是一个有效的语句,因为x ++没有左值。