为什么if(++ x = ++ y)有效,if(x ++ = ++ y)不起作用?

时间:2017-01-12 07:49:42

标签: c++ operators

当我执行这个程序时:

#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 ++){

5 个答案:

答案 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 ++没有左值。

另请参阅:Why is ++i considered an l-value, but i++ is not?