我正在研究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语言由多层规则指定。粗略地说,作为介绍:
语言语法只是语言定义的一部分。还有其他语义规则和约束,指定单独的语法不能。例如,单独的语法不能指定必须在使用之前声明变量和函数,或者一元*
运算符的操作数必须具有指针类型等。
赋值表达式存在约束,赋值的目标必须是可修改的左值,该值是指定内存区域的表达式,以便可以读取或更新该区域的内容。如果v
是变量的名称,那么它也可以作为左值。
但是,++
算子的语义规则表明++v
的结果不是左值,因此不能作为赋值的目标。
有关所有这些内容的章节和相关内容,请参阅C 2011 online draft,第6.3.2.1节(左值,数组和函数指示符),6.5.3(一元运算符)和6.5.16(赋值运算符)。