C ++,条件运算符关联性

时间:2017-01-08 00:24:19

标签: c++ associativity

在此代码中:

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

一本书说?:运算符是正确关联的。我做了互联网搜索,所以我理解了关联性意味着什么。但我无法真正理解它对上述代码意味着什么。 C ++从做什么开始?此操作应该是左关联的,因为它应该从左侧开始,执行第一个条件,并在必要时继续执行第二个条件,而不是相反。

3 个答案:

答案 0 :(得分:2)

操作员关联性与首先执行的操作无关。如果您有一个运算符@,则关联性会告诉您是否

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分支”包含另一个嵌套?:

(如果它是左关联的,那就是

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

,这没什么意义。)

答案 1 :(得分:1)

如果?:是关联的,那么语句

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");

答案 2 :(得分:0)

这很大程度上转化为:

我的最终成绩是否超过90?如果是这样,它被视为高通。否则低于60?如果是这样,它被视为失败。然后,如果结果不是90以上或60以下,那么它只被视为&#34;传递&#34;。