C++ 中嵌套三元运算符的正确关联性和执行顺序

right associativity and order of execution of nested ternary operator in c++

提问人:Raman Kumar 提问时间:9/5/2022 最后编辑:Raman Kumar 更新时间:9/5/2022 访问量:132

问:

我有关于执行顺序的解决方案,但我无法理解正确的关联性如何与场景 2 相关联。

a ? b: c ? d : e ? f : g ? h : i // scenario 1 : associativity understood, which is : (a?b:(c?d:(e?f:(g?h:i))))

a ? b ? c : d : e // scenario 2 : NOT UNDERSTOOD

这里的第一个答案来看,我能够理解第一种情况,但不能理解第二种情况。

C++ 嵌套 三元 关联性

评论

2赞 paddy 9/5/2022
没有人会以这种方式编写条件语句,除非他们正在参加代码混淆竞赛。这里的目标是什么?请参阅文档
0赞 Raman Kumar 9/5/2022
是的,@paddy,这是一个测验学习者技能的问题。我理解场景 1 ,但不理解场景 2
0赞 paddy 9/5/2022
好吧,目前还不清楚您实际上遇到了什么问题。它。该语句从左到右阅读。想象一下,你是一个编译器。运算符的优先级相同,因此在点击哪个嵌套后,直到解析条件,然后解析条件。a ? (b ? c : d) : ea ?b ?c : db: ea
0赞 Raman Kumar 9/5/2022
但是@paddy,如果三元的关联性是从右到左,为什么从左读这句话呢?
1赞 paddy 9/5/2022
我想强调的是,即使你完全理解了优先级,你也不应该指望有人在实际代码中读到这样的条件。总是用括号帮助他们。这减少了认知负荷,使陈述更清晰。通常,可以避免嵌套条件语句,这通常会导致代码更易于阅读、更易于维护,并且包含更少的错误。

答:

2赞 Jerry Coffin 9/5/2022 #1

关于这样的事情,显而易见的(通常是最好的)建议是“不要这样做”。

除此之外,我发现最简单的方法是将它们视为 Algol 风格的 s。Algol 是一个表达式,而不是一个语句,所以(很像条件,除了可读)你可以写这样的东西:ifif

a = if b then c else d;

转换非常简单。 是和是.将其应用于嵌套条件实际上非常容易,至少在我看来,结果更具可读性。x ?if (x):else

a ? b: c ? d : e ? f : g ? h : i

转换为:

if (a) {
    b; 
} else if (c) {
    d; 
} else if (e) {
    f;
} else if (g) {
    h;
} else {
    i;
}

第二个实际上也很简单,只要你记得它直接翻译成 .除此之外,我们遵循正常的 C 规则,即 an 与尚未关联的最新 an 匹配。x ?if (x)elseifelse

a ? b ? c : d : e

...成为:

if (a) {
    if (b) {
        c;
    }
    else {
        d;
    }
} else {
    e;
};

评论

0赞 Raman Kumar 9/5/2022
谢谢:)通过这个解释,我能够完全理解执行顺序,而不用关心关联性。你也可以让我理解联想性(为什么三元说从右到左联想)
0赞 Jerry Coffin 9/5/2022
@RamanKumar:该标准没有使用这个词来描述它。但就有意义的程度而言,我认为它指的是第二个示例中涵盖的内容——在 中,与 和 相关联。但至少在我看来,试图从关联性的角度思考往往会导致更多的问题,而这些问题是可以解决的。associativitya ? b ? c : d : eb ?cd
0赞 paddy 9/5/2022
@RamanKumar 请摒弃将此运算符称为“三元”或“三元运算符”的习惯。当然,它的函数是三元的,但它的名称是条件运算符
0赞 Raman Kumar 9/5/2022
@JerryCoffin,我只是想也许我们不应该在这里使用术语 associativity,因为如果有两个(或多个)相同优先级的运算符,则关联性就会出现,但在这里,两个(或更多)运算符实际上是嵌套的,这排除了关联性的概念。
0赞 rici 9/5/2022
@raman:在条件运算符的语法中,以及分组括号等功能。他们之间的任何东西都被分组;不能应用优先级和关联性。因此,解析方式与 相同。关联性是无关紧要的。右关联性是使解析成为(自然解释)的原因,而不是左关联性,这仅对编写PHP的人有意义。同样,是 ,不像 ,是 。?:a ? b ? c : d : ea ? (b ? (c) : d) : ea ? b : c ? d : ea ? b : (c ? d : e)(a ? b : c) ? d : ea = b = ca = (b = c)a - b - c(a - b) - c