开发者

Yet Another Conditional Operator Nesting Question

As per C precedence tables, the ternary conditional operator has right-to-left associativity.

So, is it directly convertible to the equivalent if-else ladder?

For example, can:

x?y?z:u:v;

be interpreted as:

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

by matching an else (:) with the closest unpair开发者_运维技巧ed if (?)? Or does right-to-left associativity imply some other arrangement?


The example you gave could only be interpreted in one way (like the if statements you gave), whether the ternary operator had right-to-left or left-to-right associativity.

Where the right-to-left associativity matters is when you have:

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

Which is interpreted as: x = a ? b : (c ? d : e), not as x = (a ? b : c) ? d : e.

To give a more realistic example:

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

This is identical to the (probably more readable) if / else-if statements:

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


Your assumption is correct; however, it is often wise to add in parentheses for readability, e.g.:

x ? ( y ? z : u ) : v
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜