【问题标题】:Operator precedence and Associativity in C/C++C/C++ 中的运算符优先级和关联性
【发布时间】:2012-08-13 21:26:22
【问题描述】:

请注意,这与 Operator Precedence.. () and ++Undefined behavior and sequence pointsWhy are these constructs (using ++) undefined behavior? 以及这里的数百个类似问题无关


简而言之:标准是否保证了关联性

详细示例:来自Wikipedia关于运算符优先级的文章,operator*operator/具有相同的优先级,它们是Left-to-right运算符。这是否意味着,标准保证,这:

int res = x / y * z / t;

将被评估为

int res = ( ( x / y ) * z ) / t;

还是定义了实现?

如果有保证,可以报价吗?


只是出于好奇,在这些情况下我总是写括号。
准备删除问题,如果有这样的问题。

【问题讨论】:

  • 是的(现在需要一些字符!)

标签: c++ c operator-precedence associativity


【解决方案1】:

来自最新公开的draft

5.6 乘法运算符 [expr.mul]

1 乘法运算符 *、/ 和 % 从左到右分组。

multiplicative-expression:
pm-expression
multiplicative-expression * pm-expression
multiplicative-expression / pm-expression
multiplicative-expression % pm-expression

所以解析会像这样:

int res = x / y * z / t;
int res = (x / y * z) / t;
int res = ((x / y) * z) / t;

【讨论】:

  • 不像int res = ( x / y ) * z / t; int res = ( ( x / y ) * z ) / t;?我在理解该命令时遇到了一些麻烦。如果是这样,为什么?你能解释一下吗(我会接受答案)
  • 我明白了,结果是一样的,只是问:)
  • 如果你看一下解析树:它是multiplicative-expression: multiplicative-expression @ pm-expression。解析表达式时,最右边的词 t 被隔离为 pm-expression,其余的词则被评估为另一个 multiplicative-expression。下一步将把z 识别为pm-experssion
  • pm-expression 是什么意思?
  • 为了解释这一点,谁还没有被引入正式语法:标准中的这段文字指出,乘法表达式(我将缩写为“ME”)必须由 pm 表达式( “PE”)或以下组合之一:“ME * PE”、“ME / PE”、“ME % PE”。出于我们的目的,诸如“x”和“y”之类的标识符已经是 PE。要从“x / y * z”形成一个ME,您必须将“x / y”变成一个ME,然后使用该ME将“ME * z”形成另一个ME。你不能先将“y * z”形成一个 ME,因为这会给你“x / ME”,并且由于 x 是一个 PE,它会是“PE / ME”......
【解决方案2】:

n3337 5.6/1

乘法运算符 *、/ 和 % 从左到右分组。

阅读 5 par 标准。

【讨论】:

    猜你喜欢
    • 2014-10-22
    • 1970-01-01
    • 2013-10-02
    • 2021-05-05
    • 2020-10-20
    • 1970-01-01
    • 2012-01-02
    • 2021-03-29
    • 2013-07-31
    相关资源
    最近更新 更多