【问题标题】:C99 associativity for operators - where is it specified?运算符的 C99 关联性 - 它在哪里指定?
【发布时间】:2012-02-23 06:19:15
【问题描述】:

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

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

但是,我找不到对关联性的明确描述,无论是左还是右。这一点很重要,因为35/5*2 将是14 对于一个变体(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

我看不到任何提及关联性的内容,标准的其他地方似乎也没有任何默认设置。

我错过了什么吗?

【问题讨论】:

    标签: c iso associativity


    【解决方案1】:

    运算符关联性未明确指定为“右关联”或“左关联”。你从语法中推断出来。在您的示例中,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) 一样解析它,这是右关联的。

    【讨论】:

    • 啊,我明白了,它实际上是在 grammar 而不是解释性文本中。这就说得通了。大概cast-expression * multiplicative-expression 将是右关联的。
    • 正确。我添加了一个取自标准的右关联示例。
    • 这就是脚注中的Left- or right-associativity is indicated in each subclause by the syntax 想要表达的意思。
    • 是的,我确实看到了,现在你已经提到了,@Jesse。感谢您指出我基本上是一个不识字的牧羊人:-)
    【解决方案2】:

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

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

    这意味着在a * b * c 中,c 必须被解析为cast-expression,而a * b 必须被解析为multiplicative-expression,然后再进一步解析a * b 本身。因此,乘法的左结合性被解析规则强加到语法树中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-12-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-22
      • 1970-01-01
      • 2015-08-02
      相关资源
      最近更新 更多