【发布时间】:2018-05-16 21:35:38
【问题描述】:
我正在尝试理解我的教授编写的代码。代码中有一行写着
a = (b > c) ? c : b;
其中 a、b 和 c 只是浮点变量。这是我第一次看到这种表情。我试图用谷歌搜索它,但没有任何结果。欢迎任何解释或对此解释的链接。谢谢。
【问题讨论】:
标签: c++ expression
我正在尝试理解我的教授编写的代码。代码中有一行写着
a = (b > c) ? c : b;
其中 a、b 和 c 只是浮点变量。这是我第一次看到这种表情。我试图用谷歌搜索它,但没有任何结果。欢迎任何解释或对此解释的链接。谢谢。
【问题讨论】:
标签: c++ expression
这是一个三元表达式。三元表达式采用以下形式:
condition ? <result_if_true> : <result_if_false>
三元表达式可以翻译成if 语句:
if (condition) {
<result_if_true>;
} else {
<result_if_false>;
}
与等价的if 语句相比,三元表达式的一个优势是变量声明。例如下面的if 语句和三元表达式是等价的,但更简洁明了:
int seconds = 4;
// ===== USING IF STATEMENT =====
string secs_string;
if (seconds == 1) {
secs_string = "second";
} else {
secs_string = "seconds";
}
cout << "You have " << seconds << " "<< secs_string << " remaining." << endl;
// Output: You have 4 seconds remaining.
// ===== USING TERNARY EXPRESSION =====
string secs_string = (seconds == 1) ? "second" : "seconds";
cout << "You have " << seconds << " "<< secs_string << " remaining." << endl;
// Output: You have 4 seconds remaining.
请注意,使用if 需要在if 语句之外单独声明字符串,而对于三元表达式,这可以内联完成。
进一步阅读
【讨论】:
condition ? <result_if_true> : <result_if_false>.
if 语句。我同意,这可能不是直接相关,但即使是复杂的东西,例如:x = a ? (b ? c : d) : (e ? f : g) 也可以减少为几个嵌套的if 语句。此外,foo(x ? y : z) 之类的内容可以脱糖为 if (x) foo(y); else foo(z);
variable = whatever 作为子表达式。你不能用 ifs 做到这一点。
if 语句的具体例子?我从来没有亲自遇到过(也许我编码的时间不够长)。我知道它们在概念上是不同的,但据我所知,它们基本上编译成同一个程序集。 (另外,我发现if 翻译是向不熟悉语法的人解释三元表达式的一种有效方式。这就是为什么我选择将它包含在我的答案中的部分原因。)
这称为条件运算符,也称为三元运算符。它只是一个压缩形式的 if 语句。
a = (b > c) ? c : b;
效果和
一样if (b > c) a = c; else a = b;
【讨论】:
cmov) 不会更改 IP,而是将条件绑定到单个指令中。在低延迟情况下,尤其是那些需要统一延迟的情况下,cmov 是首选。