什么(a == b?c:d)呢?

时间:2014-02-15 21:26:35

标签: ternary-operator

C(和许多其他语言)中的三元运算符?:是一个压缩的if-then-else语句。

它是如何工作的,为什么/何时将它用于if-then-else?

3 个答案:

答案 0 :(得分:2)

正如你所说,是一个压缩的if-then-else,因此必须根据比较编译成相同的指令。

真正的区别在于它选择了最终结果。真的,只是提高可读性的语法糖。

比较

int val = (foobar == true) ? 500 : 1000 ;

VS

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的代码模式。

答案 1 :(得分:1)

正如您所说,三元运算符的工作方式类似于if-else语句。它的主要用途是压缩代码并使其更易于阅读。 这样的事情:

int a;
if (b == c){
    a = 1;
}
else {
    a = 2;
}

可以转换为:

int a = (b == c ? 1: 2);

(这里的parantheses是不必要的,但它们使代码看起来更好)

答案 2 :(得分:-4)

条件运算符可以比传统的if-then-else块更快但是在使用它时要非常小心因为如果进入条件运算符的代码不稳定那么它会导致你遇到问题而不知道它们在哪里来自。

您还可以使用条件运算符选择要为其分配右值的左值。

(UseIntA == true)? IntA : IntB = SomeValue;