3
#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 = 6,b = 54c = 12

  1. a>b?(max=a, a=b, b=max):a; <-- 将 max 设置为 6,然后将 a 设置为 54,然后 54=max。然后比较 6 和 54 哪个是假的,并写一个 (6) 作为第一个数字?

  2. b>c?(max=b, b=c, c=max):a; <-- 将最大值设置为 54,b=12,12=最大值。然后将 54 与 12 进行比较,这在我们的例子中是正确的,并将 c=12 写为第二个数字?

  3. a>b?(max=a, a=b, b=max):a; <-- 将最大值设置为 6,a=54,54=最大值。然后将 6 与 54 进行比较,这是错误的并再次写入 6,wtf?

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

4

4 回答 4

4

这:

cond ? A : B

大致相当于

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

这:

(X, Y, Z)

大致相当于

X;
Y;
Z;

即,依次对每个表达式进行完全评估。

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

于 2012-06-14T00:29:29.537 回答
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
于 2012-06-14T00:33:37.680 回答
2
a>b?(max=a, a=b, b=max):a

最后的 ":a" 真的什么也没做,它可以很容易地是 ":0"。如果“a>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
于 2012-06-14T00:36:54.013 回答
0

好吧,基本上我就是这样。

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

第一部分只是三级 if 语句形式的普通比较,所以基本上它检查 if a>b, then?是否等于第一个括号集,所以如果它为真,它会评估第一部分,否则之后的代码:就是像 else 一样被评估..(max=a, a=b, b=max)基本上依次评估每个项目,所以 firstmax设置为a,然后a = b和 finally b = max; 其他两行也一样。

你可以在这里阅读更多:http ://www.cplusplus.com/doc/tutorial/operators/

希望这有帮助。

于 2012-06-14T00:36:31.830 回答