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");
在此代码中:
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");