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

时间:2011-01-22 20:51:07

标签: c conditional-operator

根据C优先级表,三元条件运算符从右到左 结合性。

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

例如,可以:

x?y?z:u:v;

被解释为:

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

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

2 个答案:

答案 0 :(得分:15)

您提供的示例只能以一种方式解释(如您给出的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;
}

答案 1 :(得分:6)

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

x ? ( y ? z : u ) : v