另一个条件运算符嵌套问题

6 c conditional-operator

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

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

例如,可以:

x?y?z:u:v;
Run Code Online (Sandbox Code Playgroud)

被解释为:

if(x)
{
   if(y)
   { z; }
   else
   { u; }
}
else
{ v; }
Run Code Online (Sandbox Code Playgroud)

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

int*_*jay 15

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

从右到左关联的重要性在于:

x = a ? b : c ? d : e;
Run Code Online (Sandbox Code Playgroud)

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

举一个更现实的例子:

int getSign(int x) {
    return x < 0 ? -1 :
           x > 0 ?  1 :
                    0;
}
Run Code Online (Sandbox Code Playgroud)

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

int getSign(int x) {
    if (x < 0)
         return -1;
    else if (x > 0)
         return 1;
    else return 0;
}
Run Code Online (Sandbox Code Playgroud)


Ray*_*Ray 6

你的假设是正确的; 但是,为了便于阅读,添加括号通常是明智的,例如:

x ? ( y ? z : u ) : v
Run Code Online (Sandbox Code Playgroud)

  • 我认为"不使用"被高估了.将`?`替换为`then`和`:`替换为`else`,您可以使用多种语言完全有效的选择语法.我一直在编写这样的嵌套条件,确保每个新的?和:出现在新行上,并带有正确的缩进.它与任何if/else块一样可读. (3认同)
  • +1尽管我会说在实际生产代码中嵌套条件运算符更为明智*不*:-) (2认同)
  • @Pétet:在极少数情况下,条件运算符是唯一可以完成这项工作的工具(宏和特殊用法利用其奇怪而美妙的类型转换属性),通常需要嵌套它们.:-) (2认同)
  • 另一方面,如果您来自函数式背景,您可以表达更容易返回值的选择,您会更喜欢此解决方案。替代方法通常是创建一个可变变量(函数式程序员不希望如此),这样您就可以从 if/else 块的每个部分分配不同的结果。?: 语法是在 C 和其他语言中实现相同表达能力的唯一方法。这不仅仅是减少代码行数。无论如何,可读性是主观的。 (2认同)