2

我正在阅读一本名为 A Retargetable C Compiler: Design and Implementation 的书。在本书中,C 语言语法是这样指定的:

expression:
  assignment-expression { , assignment-expression }
assignment-expression:
  conditional-expression
  unary-expression assign-operator assignment-expression
assign-operator:
  one of= += -= *= /= %= <<= >>= &= A= I=
conditional-expression:
  binary-expression [ ? expression : conditional-expression ]
binary-expression:
  unary-expression { binary-operator unary-expression }
binary-operator:
  one of || && '|' A & == ! = < > <= >= << >> + - * | %
unary-expression:
  postfix-expression
  unary-opera tor unary-expression
  '(' type-name ')' unary-expression
  sizeof unary-expression
  sizeof '(' type-name ')'
unary-operator:
  one of ++ -- & * + - - !
postfix-expression:
  primary-expression { postfix-operator }
postfix-operator:
  '[' expression ']'
  '(' [ assignment-expression { , assignment-expression } ] ')'
. identifier
-> identifier
++
--
primary-expression:
  identifier
  constant
  string-literal
  '(' expression ')'

我对我观察到的一些事情有疑问:

expression:
    assignment-expression

unary-expression assign-operator assignment-expressionassignment-expression.

我选择"sizeof '(' type-name ')'" 一元表达式。

然后我选择"="分配运算符。

然后我选择"conditional-expression"了赋值表达式。

然后我得出这样的结论:

conditional-expression -> binary-expression -> unary-expression ->postfix-expression -> primary-expression -> identifier

作为以上所有的结果,我可以生成这样的表达式: "sizeof(int) = 7".

但是这个表达式在 C 语言中是不可能的。上面的语法列表是否有问题,或者我以错误的方式产生这个表达式?

4

1 回答 1

2

某些东西在语法上是正确的并不意味着它在逻辑上是正确的。这个表达sizeof(int) = 7可能在语法上是正确的,但它没有多大意义。所以你的编译器而不是溢出error: syntax error将正确地标记和解释语句并告诉你error: cannot assign to result of sizeof

关于这个话题,您可能对C11 标准草案中的附件 A.1 词汇语法感兴趣。

于 2020-09-28T12:19:28.343 回答