无法理解逗号表达式
Cannot understand comma expression
#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/
希望这有帮助。
- (C++)分析树以计算返回错误值的简单算术表达式
- 在VS2010-VS2015下编译时,如何使用decltype作为较大类型表达式的LHS
- 提升精神:解析布尔表达式并简化为规范范式
- 不能在初始值设定项列表中将非常量表达式从类型 'int' 缩小到'unsigned long long'
- 使用正则表达式regex_search在字符串中查找字符串
- 如何确认我的constexpr表达式实际上已经在编译时执行
- 概念中的cv限定符需要表达式参数列表
- 为什么constexpr的性能比正常表达式差
- 对于结构,表达式必须是可修改的ivalue
- 当一个值是非常量但用常量表达式初始化时使用constexpr
- 将fold表达式与std::一起用于两个元组
- 断言中的Fold表达式在某些计算机上编译,但在其他计算机上不编译
- 标记 '","' 之前的预期主表达式
- gcc和clang在表达式是否为常量求值的问题上存在分歧
- 如何计算具有指定类型的表达式的相对精度和绝对精度
- 带有用户定义类的c++折叠表达式
- 即使使用调试编译标志,表达式也是"optimized out"
- holeMenuProgram.cpp:38:1 错误:'}'令牌之前的预期主表达式
- 在 C++ 中使用正则表达式错误时出现问题 括号表达式中的范围无效
- 这 4 个 lambda 表达式之间有什么区别?