C++,条件运算符结合性

C++, conditional operator associativity

在此代码中:

finalgrade = (grade > 90) ? "high pass" : (grade < 60) ? "fail" : "pass";

一本书说 ?: 运算符是右结合的。我进行了互联网搜索,所以我了解关联性的含义。但是我真的无法理解上面代码的含义。 C++ 从做什么开始?这个操作应该是左关联的,因为它应该从左边开始,执行第一个条件,并在必要时继续执行第二个条件,而不是相反。

这几乎可以转化为:

我的期末成绩是否在 90 分以上?如果是这样,它被认为是高通。否则低于60?如果是这样就被认为是失败的。然后,如果结果高于 90 或低于 60,则仅视为 "pass".

运算符结合性与先执行什么无关。如果你有一个运算符@,结合律告诉你是否

a @ b @ c

应该读作

(a @ b) @ c

a @ (b @ c)

在您的例子中,? ... : 的工作方式类似于右结合运算符:

(grade > 90) ? "high pass" : (grade < 60) ? "fail" : "pass"

解析为

(grade > 90) ? "high pass" : ((grade < 60) ? "fail" : "pass")

换句话说,第一个?:的"else branch"包含另一个嵌套的?:

(如果它是关联的,它将是

((grade > 90) ? "high pass" : (grade < 60)) ? "fail" : "pass"

,这没什么意义。)

如果 ?: 左结合,语句

finalgrade = (grade > 90) ? "high pass" : (grade < 60) ? "fail" : "pass";

将被视为

finalgrade = ((grade > 90) ? "high pass" : (grade < 60)) ? "fail" : "pass";

(在本例中)无法编译,因为 "high pass"(grade < 60) 具有不同的类型。

因为它实际上是右结合的,所以该语句被视为

finalgrade = (grade > 90) ? "high pass" : ((grade < 60) ? "fail" : "pass");