【问题标题】:order of evaluation of comparison operator?比较运算符的评估顺序?
【发布时间】:2016-08-04 14:44:15
【问题描述】:

我了解到逻辑运算符可以保证它们的评估是从左到右的,但我想知道比较运算符的评估顺序是什么。例如expression1 < expression2,换句话说,它保证expression1 将在expression2 之前首先被评估。

【问题讨论】:

  • <>==!= 中没有序列点。它们都是从左到右关联的。
  • if (printf("%d", 1) < printf("%d", 2)) printf("%d", 3); 将打印“12”或“21”。
  • @EOF 就这么简单!一句话包含了所有需要的东西。谢谢:)

标签: c


【解决方案1】:

按照标准:

J.1 未指明的行为

以下未指定:
....

——子表达式的求值顺序和副作用的顺序 发生,除非函数调用 ()&&||?: 和逗号指定 运算符 (6.5)。

【讨论】:

    【解决方案2】:

    一般来说,表达式中子表达式的求值顺序是不确定的。

    唯一有顺序的地方,即序列点,是||(逻辑或)、&&(逻辑与)、,(逗号)和?:(三元)运算符。

    && 的情况下,如果左边的表达式计算结果为假(即0),则结果为假,不计算右边。与|| 类似,如果左侧表达式的计算结果为真(即不为 0),则结果为真且不计算右侧。

    对于三元运算符,首先计算条件。如果计算结果为真,则只计算中间部分,否则只计算第三部分。

    对于逗号运算符,首先计算左侧,然后计算右侧。

    来自C standard

    6.5.13.4 与按位二进制 & 运算符不同,&& 运算符保证从左到右的求值;有一个序列点 在评估第一个操作数之后。如果第一个 操作数比较等于 0,不计算第二个操作数。

    ...

    6.5.14.4 不同于按位 |运算符,||运算符保证从左到右的评估;之后有一个序列点 评估第一个操作数。如果第一个操作数 比较不等于 0,不计算第二个操作数。

    ...

    6.5.15.4 评估第一个操作数;在其评估之后有一个序列点。只有当 首先比较不等于0;仅在以下情况下评估第三个操作数 第一个比较等于 0;结果是第二个的值 或第三个操作数(以被评估者为准),转换为类型 如下面所描述的。如果尝试修改结果 条件运算符或在下一个序列点之后访问它, 行为未定义。

    ....

    6.5.17.2 逗号运算符的左操作数被评估为 void 表达式;在它之后有一个序列点 评估。然后对右操作数求值;结果有它的 类型和值。如果尝试修改逗号的结果 运算符或在下一个序列点之后访问它,行为 未定义。

    【讨论】:

    • 我希望你的答案中包含标准,但你的答案真的很有帮助谢谢!
    【解决方案3】:

    不,规范没有提到关系运算符的操作数的求值顺序。未指定。

    只是添加,relational operators are left-to-right associative

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-30
      • 1970-01-01
      • 2016-12-31
      • 2014-01-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多