首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >有些C表达式在语法中是允许的,而在实际编译时是不允许的,这正常吗?

有些C表达式在语法中是允许的,而在实际编译时是不允许的,这正常吗?
EN

Stack Overflow用户
提问于 2019-04-08 01:06:11
回答 1查看 59关注 0票数 1

我在学习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;
EN

回答 1

Stack Overflow用户

发布于 2019-04-08 08:56:35

语言语法只是语言定义的一部分。还有一些额外的语义规则和约束,它们指定了语法本身无法指定的内容。例如,语法本身不能指定变量和函数必须在使用前声明,或者一元*运算符的操作数必须具有指针类型,等等。

对赋值表达式的约束是赋值的目标必须是可修改的左值,该左值是指定存储器区域使得该区域的内容可以被读取或更新的表达式。如果v是一个变量的名称,那么它也是一个左值。

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

有关这一切的章节和章节,请参阅C 2011 online draft,6.3.2.1节(L值、数组和函数指示符)、6.5.3节(一元运算符)和6.5.16节(赋值运算符)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55561604

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档