对于语法允许的某些C表达式是否正常,在实践中编译时是不允许的?

问题描述 投票:1回答:2

我正在研究C语法:http://www.quut.com/c/ANSI-C-grammar-y-1999.html#unary-expression

有这个规则

assignment_expression
: conditional_expression
| unary_expression assignment_operator assignment_expression
;

unary_expression
: postfix_expression
| INC_OP unary_expression
| DEC_OP unary_expression
| unary_operator cast_expression
| SIZEOF unary_expression
| SIZEOF '(' type_name ')'
;

那么我们为什么不能这样做:

++v = 3<4 ? 10 : 2;

既然++ v是一个unary_expression?

c syntax compilation grammar
2个回答
3
投票

是的,这是正常的。 C语言由多层规则指定。粗略地说,作为介绍:

  • 根据C的词法规则将各个字符收集到预处理标记中。
  • 语法指定允许哪些预处理令牌序列以及它们如何被解释(结构化为树形式)。
  • C标准中指定的约束添加了语法无法指定的语义规则。例如,赋值运算符的约束是它的左操作数应具有可修改的左值。
  • C标准中的附加规则指定语义和附加要求。

1
投票

语言语法只是语言定义的一部分。还有其他语义规则和约束,指定单独的语法不能。例如,单独的语法不能指定必须在使用之前声明变量和函数,或者一元*运算符的操作数必须具有指针类型等。

赋值表达式存在约束,赋值的目标必须是可修改的左值,该值是指定内存区域的表达式,以便可以读取或更新该区域的内容。如果v是变量的名称,那么它也可以作为左值。

但是,++算子的语义规则表明++v的结果不是左值,因此不能作为赋值的目标。

有关所有这些内容的章节和相关内容,请参阅C 2011 online draft,第6.3.2.1节(左值,数组和函数指示符),6.5.3(一元运算符)和6.5.16(赋值运算符)。

© www.soinside.com 2019 - 2024. All rights reserved.