提问人:Raman Kumar 提问时间:9/5/2022 最后编辑:Raman Kumar 更新时间:9/5/2022 访问量:132
C++ 中嵌套三元运算符的正确关联性和执行顺序
right associativity and order of execution of nested ternary operator in c++
问:
我有关于执行顺序的解决方案,但我无法理解正确的关联性如何与场景 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
从这里的第一个答案来看,我能够理解第一种情况,但不能理解第二种情况。
答:
2赞
Jerry Coffin
9/5/2022
#1
关于这样的事情,显而易见的(通常是最好的)建议是“不要这样做”。
除此之外,我发现最简单的方法是将它们视为 Algol 风格的 s。Algol 是一个表达式,而不是一个语句,所以(很像条件,除了可读)你可以写这样的东西:if
if
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)
else
if
else
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:该标准没有使用这个词来描述它。但就有意义的程度而言,我认为它指的是第二个示例中涵盖的内容——在 中,与 和 相关联。但至少在我看来,试图从关联性的角度思考往往会导致更多的问题,而这些问题是可以解决的。associativity
a ? b ? c : d : e
b ?
c
d
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 : e
a ? (b ? (c) : d) : e
a ? b : c ? d : e
a ? b : (c ? d : e)
(a ? b : c) ? d : e
a = b = c
a = (b = c)
a - b - c
(a - b) - c
评论
a ? (b ? c : d) : e
a ?
b ?
c : d
b
: e
a