运营商的C99关联性 – 指定在哪里?
在C99标准中,表达式允许优先级和关联性。
由于运算符在文档中出现的顺序优先级较低,所以优先级记录得非常好,因此函数调用在乘法运算符之前出现,而乘法运算符又在加法运算符之前出现。
但是,我无法找到关联性的明确描述,无论是左还是右。 这很重要,因为(35/5)*2
对于一个变体(35/5)*2
35/5*2
将是14
对于另一个变体35/(5*2)
。
第6.5 Expressions /3, footnote 74
节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
约束
每个操作数都应具有算术类型。
%
运算符的操作数应具有整数类型。语义
通常的算术转换是在操作数上执行的。
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
。 因此,通过解析规则将乘法的左关联性强制进入语法树。