运营商的C99关联性 – 指定在哪里?

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

由于运算符在文档中出现的顺序优先级较低,所以优先级记录得非常好,因此函数调用在乘法运算符之前出现,而乘法运算符又在加法运算符之前出现。

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

6.5 Expressions /3, footnote 746.5 Expressions /3, footnote 74状态:

语法指定运算符在表达式求值中的优先级,该子表达式与本子条款的主要子条款的顺序相同,优先级最高。

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

但是,以乘法情况为例,例如:

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

约束

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

语义

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

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

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

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

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

我在这里错过了什么吗?

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

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

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

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

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

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

这意味着在a * b * c ,在进一步解析a * b本身之前, c必须被解析为cast-expression ,并且a * b作为一个multiplicative-expression 。 因此,通过解析规则将乘法的左关联性强制进入语法树。