【问题标题】:C++, conditional operator associativity [duplicate]C ++,条件运算符关联性[重复]
【发布时间】:2017-05-22 12:57:41
【问题描述】:

在这段代码中:

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

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

【问题讨论】:

标签: c++ associativity


【解决方案1】:

运算符关联性与首先执行的内容无关。如果你有一个运算符@,关联性会告诉你是否

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"

,这没什么意义。)

【讨论】:

  • "运算符关联性与先执行的内容无关。"但是在(a @ b) @ c 中,肯定会首先执行a @ b,而不是b @ c
  • @artm 考虑(f() @ g()) @ h()。您不知道首先调用哪个函数。在我的陈述中,我指的是abc的执行。
  • @artm 即使这样,考虑a &amp;&amp; (b &amp;&amp; c)。在 C++ 中,b &amp;&amp; c 不能先执行,因为如果 afalse,第一个 &amp;&amp; 会立即返回 false
  • 我认为如果没有这个声明会更清楚.. 我喜欢简单解释左(和右)关联性意味着什么的部分
【解决方案2】:

如果?: 保持关联,则语句

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

将被视为

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

其中(在这种情况下)不会编译,因为 "high pass"(grade &lt; 60) 具有不同的类型。

由于它实际上是右结合的,因此该语句被视为

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

【讨论】:

    【解决方案3】:

    这几乎可以翻译为:

    我的期末成绩是否超过 90?如果是这样,它被认为是高通。还是低于60?如果是这样,它被认为是失败的。然后,如果结果不是高于 90 或低于 60,则仅视为“通过”。

    【讨论】:

      猜你喜欢
      • 2021-04-14
      • 2021-04-22
      • 2013-10-02
      • 1970-01-01
      • 1970-01-01
      • 2014-08-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多