【发布时间】:2014-03-15 06:14:39
【问题描述】:
C(和许多其他语言)中的三元运算符?: 是一个压缩的 if-then-else 语句。
例如:
a > b ? func(a) : func(b) ;
为什么/什么时候你会在 if-then-else 上使用它?
它在功能上与if...else 有什么不同吗?如果有,有什么不同?
【问题讨论】:
C(和许多其他语言)中的三元运算符?: 是一个压缩的 if-then-else 语句。
例如:
a > b ? func(a) : func(b) ;
为什么/什么时候你会在 if-then-else 上使用它?
它在功能上与if...else 有什么不同吗?如果有,有什么不同?
【问题讨论】:
正如您已经说过的,三元运算符的工作方式类似于 if-else 语句。它的主要用途是压缩您的代码并使其更易于阅读。 类似的东西:
int a;
if (b == c){
a = 1;
}
else {
a = 2;
}
可以转换为:
int a = (b == c ? 1: 2);
(括号在这里是不必要的,但它们使代码看起来更好)
【讨论】:
条件运算符可以比传统的 if-then-else 块更快,但是在使用它时要非常小心,因为如果进入条件运算符的代码不稳定,那么它可能会导致您遇到问题而不知道它们在哪里来自。
您还可以使用条件运算符来选择将右值分配给哪个左值。
(UseIntA == true)? IntA : IntB = SomeValue;
【讨论】:
正如您所说,它是一个压缩的 if-then-else,因此在比较方面必须将其编译为相同的指令。
真正的区别在于它选择了最终结果。真的,只是提高可读性的语法糖。
比较:
int val = (foobar == true) ? 500 : 1000 ;
对比:
int val = 0;
if (foobar == true)
{
val = 500;
} else {
val = 1000;
}
可以说这只是风格问题,因此是主观的。但是,当您拥有更复杂的决策树时,可读性会变得更大,例如:
int val = (flag01 == true) ?
(flag02 == true ) ? 100 : 200 :
(flag03 == true ) ? 300 : 400 ;
您可以在一个地方将许多决策链接在一起,而不是编写一堆嵌套的 if-then-else 子句:
int val = 0;
if (flag01 == true)
{
if (flag02 == true)
{
val = 100;
} else {
val = 200;
}
} else {
if (flag03 == true)
{
val = 300;
} else {
val = 400;
}
}
这有点遵循称为method chaining 的代码模式。
【讨论】: