9

在 C99 标准中,表达式允许优先级和关联性。

由于运算符在文档中出现的顺序是递减优先级,因此优先级得到了很好的记录,因此函数调用位于乘法运算符之前,而乘法运算符又位于加法运算符之前。

但是,我找不到对关联性的明确描述,无论是左还是右。这很重要,因为35/5*214适用于一个变体(35/5)*23另一个变体35/(5*2)

部分6.5 Expressions /3, footnote 74状态:

语法规定了表达式求值中运算符的优先级,与本小节主要小节的顺序相同,最高优先级在前。

在每个主要子条款中,运算符具有相同的优先级。左或右结合性在每个子条款中由其中讨论的表达式的语法指示。

但是,以乘法为例:

6.5.5 乘法运算符
  语法
    multiplicative-expression:
      cast-expression
      multiplicative-expression * cast-expression
      multiplicative-expression / cast-expression
      multiplicative-expression % cast-expression

  约束

每个操作数都应具有算术类型。运算符的操作数%应为整数类型。

  语义

通常的算术转换是在操作数上执行的。

二元*运算符的结果是操作数的乘积。

运算符的结果/是第一个操作数除以第二个的商;运算符的结果%是余数。在这两种操作中,如果第二个操作数的值为零,则行为未定义。

当整数被除法时,/运算符的结果是代数商,其中任何小数部分被丢弃。如果商a/b是可表示的,表达式(a/b)*b + a%b应该等于a

我在那里看不到任何提到关联性的东西,标准中的其他地方似乎也没有任何默认设置。

我在这里错过了什么吗?

4

2 回答 2

10

运算符关联性未明确指定为“右关联”或“左关联”。你从语法中推断出来。在您的示例中,该multiplicative-expression术语递归地引用自身,并且递归位于运算符的左侧。这意味着遇到的解析器a * b * c必须解析a * b * clike (a * b) * c,这是左关联的。

术语assignment-expression(6.5.16) 具有以下语法:

assignment-expression:
    conditional-expression
    unary-expression assignment-operator assignment-expression

所以遇到的解析器a = b = c必须像 一样解析它a = (b = c),这是右关联的。

于 2012-02-23T06:23:32.733 回答
3

语法本身通过使用的产生式指定关联性:

multiplicative-expression:
  cast-expression
  multiplicative-expression * cast-expression

这意味着在进一步解析自身之前a * b * cc必须将 in 解析为 acast-expressiona * bone 。因此,解析规则将乘法的左结合性强加到语法树中。multiplicative-expressiona * b

于 2012-02-23T06:27:32.477 回答