无法理解逗号表达式

时间:2012-06-14 00:26:17

标签: c++ numbers operator-keyword comma

#include <iostream>
using namespace std;
int main()
{
    int a, b, c, max;
    cout<<"a="; cin>>a;
    cout<<"b="; cin>>b;
    cout<<"c="; cin>>c;
    a>b?(max=a, a=b, b=max):a;
    b>c?(max=b, b=c, c=max):a;
    a>b?(max=a, a=b, b=max):a;
    cout<<a<<"  "<<b<<"  "<<c;
}

这是一个代码,您可以在其中输入3个随机数,它将按顺序排列。但是,我不明白这一部分:

a>b?(max=a, a=b, b=max):a;
b>c?(max=b, b=c, c=max):a;
a>b?(max=a, a=b, b=max):a;

它是如何工作的,为什么?

我们说a = 6b = 54c = 12

  1. a&gt; b?(max = a,a = b,b = max):a; &lt; - 将max设置为6,然后设置为54,然后设置为54 = max。然后比较6到54这是假的并写一个(6)作为第一个数字?

  2. b&gt; c?(max = b,b = c,c = max):a; &lt; - 将max设置为54,b = 12,12 = max。然后比较54到12,这在我们的情况下是正确的并且写c = 12作为第二个数字?

  3. a&gt; b?(max = a,a = b,b = max):a; &lt; - 将max设置为6,a = 54,54 = max。然后比较6到54这是假的并再次写入6,wtf?

  4. 程序本身可以正常工作。我只是不明白算法是如何工作的。

4 个答案:

答案 0 :(得分:4)

此:

cond ? A : B

大致等同于:

if (cond) {
    A;
} else {
    B;
}

此:

(X, Y, Z)

大致等同于:

X;
Y;
Z;

即。反过来,每个表达式都被完全评估。

使用这两个规则,您应该能够跟踪代码的执行情况。但是,该代码是怪诞的,应该永远不会这样写。所以我的建议是忽略它,并正确编写算法。

答案 1 :(得分:2)

所有代码都在滥用逗号运算符在一个语句中执行多项操作以在一个语句中交换值的能力。

第一行找到前两个数字的最大值。第二个找到最大值和第三个,这样它现在找到了三者中最大的一个。然后第三行按顺序排列其他两个。

与此基本相同:

if (a > b)
    swap (a, b); //b is max(a,b)
if (b > c)
    swap (b, c); //c is max(max(a,b),c), which is largest
if (a > b)
    swap (a, b); //b is max (a, b), so numbers are in order smallest to largest

答案 2 :(得分:2)

a>b?(max=a, a=b, b=max):a

最后的“:a”确实没有做任何事情,它可能很容易就是“:0”。如果“a&gt; b”为假,则基本上是要执行的陈述。但由于a没有分配给任何东西,它什么也没做。所以在这种情况下

if(a > b){
    max = a;
    a = b;
    b = max;
}

它使用max变量来交换a和b; SAME算法用于以下两行。基本上

if a > b then swap them
now if b (which could hold a) > c then swap them
now if a (which could hold the older b) > b(which could hold the oldest c) then swap

答案 3 :(得分:0)

嗯,基本上我就是这样。

a>b?(max=a, a=b, b=max):a;

第一部分只是一个叔if语句的正常比较,所以基本上它检查a>b,然后?是否等于第一个括号集,所以如果它是真的,它会评估第一部分,否则:之后的代码就像其他一样,并且会被评估。(max=a, a=b, b=max)基本上依次评估每个项目,因此首先将max设置为a,然后是a = b,最后是b = max;其他两行相同。

您可以在此处阅读更多内容:http://www.cplusplus.com/doc/tutorial/operators/

希望这会有所帮助。