C语法生成无效的表达式

问题描述

我正在读一本书namad A Retargetable C Compiler:设计与实现。 本书中的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 ')'

表达式: 任务表达式

然后我将“一元表达式assign-operator赋值表达式”作为赋值表达式

我为一元表达式选择“ sizeof'('type-name')'”

然后我为分配运算符选择“ =”

然后我为分配表达式选择了“条件表达式”

然后我这样得出:

条件表达式->二进制表达式->一元表达式->后缀表达式->主表达式->标识符

因此,我可以生成一个这样的表达式: “ sizeof(int)= 7”

,但是在C语言中无法使用此表达式。 有问题吗?还是我用错误的方式产生了这个表达式?

解决方法

语法上正确的东西并不意味着它在逻辑上是正确的。表达式sizeof(int) = 7在语法上可能是正确的,但意义不大。因此,您的编译器不会溢出error: syntax error,而是会正确标记和解释该语句并告诉您error: cannot assign to result of sizeof

您可能对Annex A.1 Lexical grammar in C11 standard draft感兴趣。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...