【问题标题】:Yet Another Conditional Operator Nesting Question另一个条件运算符嵌套问题
【发布时间】:2011-06-13 19:39:48
【问题描述】:

根据 C 优先级表,三元条件运算符具有从右到左的顺序 关联性。

那么,它是否可以直接转换为等效的 if-else 阶梯?

例如,可以:

x?y?z:u:v;

被解释为:

if(x)
{
   if(y)
   { z; }
   else
   { u; }
}
else
{ v; }

通过将 else (:) 与最接近的未配对 if (?) 匹配?或者从右到左的关联性是否意味着其他一些安排?

【问题讨论】:

    标签: c conditional-operator


    【解决方案1】:

    您给出的示例只能以一种方式解释(例如您给出的 if 语句),无论三元运算符具有从右到左还是从左到右的关联性。

    从右到左的关联性很重要,当你有:

    x = a ? b : c ? d : e;
    

    解释为:x = a ? b : (c ? d : e),而不是x = (a ? b : c) ? d : e

    举一个更现实的例子:

    int getSign(int x) {
        return x < 0 ? -1 :
               x > 0 ?  1 :
                        0;
    }
    

    这与 if / else-if 语句(可能更具可读性)相同:

    int getSign(int x) {
        if (x < 0)
             return -1;
        else if (x > 0)
             return 1;
        else return 0;
    }
    

    【讨论】:

      【解决方案2】:

      你的假设是正确的;然而,为了可读性,添加括号通常是明智的,例如:

      x ? ( y ? z : u ) : v
      

      【讨论】:

      • +1 虽然我会说在实际生产代码中嵌套条件运算符更明智 not :-)
      • 我认为“不使用”被高估了。将? 替换为then,将: 替换为else,您可以在多种语言中获得完全有效的选择语法。我一直在写这样的嵌套条件,确保每个新的?和 : 出现在新行上,缩进正确。它与任何 if/else 块一样可读。
      • @Pétet:在少数情况下,条件运算符是唯一可以完成这项工作的工具(宏和利用其奇怪而奇妙的类型转换属性的特殊用法),嵌套它们通常是必要的. :-)
      • 我偶尔不得不维护一些人编写的代码,他们的生活目标似乎是使用尽可能少的代码来完成每项任务。我并不是要打断他们——这是一个完全正确的问题;我只是发现,与略微减小的源代码文件大小相比,富有表现力、可读性的代码更有价值。
      • 另一方面,如果您来自功能背景,可以更轻松地表达选择返回值,您会更喜欢此解决方案。另一种方法通常是创建一个可变变量(函数式程序员不希望这样做),这样您就可以从 if/else 块的每个部分分配不同的结果。 ?: 语法是在 C 和其他语言中实现相同表达能力的唯一方法。这不仅仅是减少代码行数。无论如何,可读性是主观的。
      猜你喜欢
      • 2014-01-09
      • 2013-06-27
      • 2010-12-27
      • 2010-12-20
      • 2021-09-10
      • 2021-05-27
      • 1970-01-01
      • 2014-08-15
      • 2021-12-01
      相关资源
      最近更新 更多