#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 = 54
和c = 12
。
a>b?(max=a, a=b, b=max):a; <-- 将 max 设置为 6,然后将 a 设置为 54,然后 54=max. 然后将 6 与 54 进行比较,这是假的,并将 (6) 写成第一个数字?
b>c?(max=b, b=c, c=max):a; <-- 将 max 设置为 54, b=12, 12=max. 然后将 54 与 12 进行比较,这在我们的例子中是正确的,并将 c=12 写为第二个数字?
a>b?(max=a, a=b, b=max):a;<-- 将 max 设置为 6, a=54, 54=max. 然后将 6 与 54 进行比较,这是假的,并再次写入 6,WTF?
程序本身工作正常。我只是不明白算法是如何工作的。
这个:
cond ? A : B
大致相当于这个:
if (cond) {
A;
} else {
B;
}
这:
(X, Y, Z)
大致相当于这个:
X;
Y;
Z;
即依次完全计算每个表达式。
使用这两个规则,您应该能够跟踪代码的执行。 但是,该代码很怪诞,永远不应该这样编写。 所以我的建议是忽略它,并正确编写算法。
代码所做的只是滥用逗号运算符在一个语句中执行多项操作以交换值的能力。
第一行找到前两个数字的最大值。第二个找到最大值,第三个,所以它现在找到了三个中最大的。第三行随后按顺序对其他两行进行排序。
它和这个差不多:
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
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
好吧,本质上我就是这样。
a>b?(max=a, a=b, b=max):a;
第一部分只是以三级 if 语句的方式进行的正常比较,所以基本上它会检查是否a>b
,那么?
正好等于第一个括号集,所以如果它为 true,它会计算第一部分,否则:
之后的代码就像其他代码一样,这就是被评估的。(max=a, a=b, b=max)
基本上是依次评估每个项目,所以首先max
设置为a
,然后a = b
,最后b = max
; 其他两行相同。
您可以在此处阅读更多内容:http://www.cplusplus.com/doc/tutorial/operators/
希望这有帮助。