【问题标题】:Why would you choose to use the ternary operator (?:) over a "traditional" if..else block? [duplicate]为什么选择使用三元运算符 (?:) 而不是“传统” if..else 块? [复制]
【发布时间】:2014-03-15 06:14:39
【问题描述】:

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

例如:

a > b ? func(a) : func(b) ;

为什么/什么时候你会在 if-then-else 上使用它?

在功能上if...else 有什么不同吗?如果有,有什么不同?

【问题讨论】:

    标签: conditional-operator


    【解决方案1】:

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

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

    可以转换为:

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

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

    【讨论】:

    • 它真的“让它更容易阅读”吗? if-then-else 语句之间还有其他区别吗?
    • 想一想,我知道三元运算符和 if-else-statement 之间没有区别,除非您可以缩短代码,并且由于 if 的“内部结构”,它可能会更快-else 语句
    【解决方案2】:

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

    您还可以使用条件运算符来选择将右值分配给哪个左值。

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

    【讨论】:

      【解决方案3】:

      正如您所说,它是一个压缩的 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 的代码模式。

      【讨论】:

        猜你喜欢
        • 2014-06-16
        • 1970-01-01
        • 2013-10-09
        • 1970-01-01
        • 2022-01-17
        • 2012-07-23
        • 1970-01-01
        • 2021-07-03
        • 2021-03-31
        相关资源
        最近更新 更多