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

发布于 2024-10-13 18:29:07 字数 318 浏览 5 评论 0原文

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

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

例如,可以:

x?y?z:u:v;

被解释为:

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

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

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 unpaired if (?)? Or does right-to-left associativity imply some other arrangement?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

放手` 2024-10-20 18:29:07

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

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;
}
短叹 2024-10-20 18:29:07

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

x ? ( y ? z : u ) : v

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

x ? ( y ? z : u ) : v
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文