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

问题描述 投票:6回答:2

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

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

例如,可以:

x?y?z:u:v;

被解释为:

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

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

c conditional-operator
2个回答
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;
}

6
投票

你的假设是正确的;然而,为了便于阅读,在括号中加上通常是明智的,例如:

x ? ( y ? z : u ) : v
© www.soinside.com 2019 - 2024. All rights reserved.