3

我不太明白 C99 中的语法是什么意思。这里所说的 C99 是指 ISO/IEC 9899:1999。好吧,我认为语法语法部分自 ANSI C、C89 以来变化不大。

以这个问题为例:

6.5.5 Multiplicative operators
  Syntax
    multiplicative-expression:
      cast-expression
      multiplicative-expression * cast-expression
      multiplicative-expression / cast-expression
      multiplicative-expression % cast-expression

  Constraints

Each of the operands shall have arithmetic type. The operands of the % operator
shall have integer type.

  Semantics

The usual arithmetic conversions are performed on the operands.
The result of the binary * operator is the product of the operands.
The result of the / operator is the quotient 

我想知道为什么在乘法运算符的语法中我们有一个“cast-expression”?这个语法可以暗示什么语法?在那个问题中@Avi 说

a*b*c

“c 必须被解析为强制转换表达式”,我不太明白这一点。

再举一个c99 6.6.1的例子,常量表达式的语法

Syntax
   constant-expression:
       conditional-expression

为什么这个条件表达式会出现在这里?有人可以告诉我如何解释这些语法吗?谢谢大家。

4

2 回答 2

3

我想知道为什么在乘法运算符的语法中我们有一个“cast-expression”?

这是上下文无关文法中使用的典型设备,用于指定具有相同优先级的运算符的分组并首先指定优先级(好吧,这并不精确;文法可以表达的不仅仅是为运算符分配优先级,但如果我们只想在 CFG 中表达简单的基于优先级的表达式评估,我们会这样做)。无论如何都与;cast-expression无关 multiplicative-expression它只是“任何不包含乘法运算或低优先级运算的表达式”。

那么,这将如何工作:

  1. 相同优先级运算符的分组:

    1*2*3*4
    

    在这种情况下,有以下分组可能性(仅限顶级):

    • 1*(2*3*4)
    • (1*2)*(3*4)
    • (1*2*3)*4

    通过查看语法,我们知道左边的任何东西都*必须是 a cast-expression,也就是说,不能包含 (unparenthesized) *。因此,只有第三种选择是可行的

  2. 优先级。想象一下表情

    a*b+c
    

    它可以被解析为

    • (a*b)+c
    • a*(b+c)

    但是,我们知道cast-expression右侧的 不能包含(未加括号的)+(或者如果我们检查它,我们可以从语法中解决它)。这使得第一个选项成为唯一可能的选择。

    另一种表达方式

    a+b*c
    

    反过来,可以被解析为

    • (a+b)*c
    • a+(b*c)

    但是, multiplicative-expression左侧的*也不能包含(未加括号)(留作+读者练习)。因此,只有第二种选择是可行的。

关于条件表达式的问题:语法规则不允许将任何等效或低于赋值运算符的内容解析为constant-expressions。因此,a=b, a,b,a+=b不可能是常量表达式,而a+b,a[b]a(b)可能是。请注意,它不允许例如。(a=b); 您必须查看指定什么是常量表达式的实际子句,这比语法更限制了常量表达式的范围。

于 2012-04-25T13:15:36.247 回答
1

我想知道为什么在乘法运算符的语法中我们有一个“cast-expression”?

让我们从一个更简单的问题和相应更简单的语法开始。我们将定义一个语法来表示一个简单的算术表达式(1 + 23 * (4 - 2)42等)。由于我们希望一个普通的数字常量成为一个合法的表达式,我们必须定义我们的语法,使得有一条从根非终结表达式到简单数字的路径:

表达式术语  |
    术语加法表达式

术语因子|
    因子多操作项

因素数字|
    (表达

像numberadd-opmul-op这样的非终结符应该是显而易见的。

42是 一个, 是要素的 产物 , 是术语的 产物 , 是表达的 产物. 因此42,根据我们的语法,这是一个合法的算术表达式;termfactor是这条路径的中间产物。

C 语法中也发生了类似的事情。强制转换表达式是表达式和​​某个终结符(例如标识符或数字常量)之间的中间产生式。我们的简单语法定义了 2 级优先级;C 语法定义了 16 个不同的优先级,并带有更多的运算符,因此沿着这条路径有更多的中间产品。我们希望强制转换表达式乘法表达式具有更高级别的优先级,这样我们就可以处理类似的情况

x = a * (int) b;

适当地。

于 2012-04-25T14:49:03.400 回答