int c = 0;
考虑到上面的代码,c = 0
由于以下规则,它是一个init声明符,也是一个表达式:
init-declarator:
声明程序初始化器(opt)一个全表达式为:
[...]
的INIT-声明符或MEM-初始化,包括初始化的组成表达式
只要一个表达式,它就会有一个值类别。
prvalue是一个表达式,其求值初始化一个对象或位域,或计算一个运算符的操作数的值,该值由其出现的上下文指定。
的评估a = 0
将初始化对象a
。因此,完整表达式c=0
是prvalue表达式吗?如果我误解了,请更正我。
考虑上面的代码,其中c = 0是一个init-declarator,它也是一个表达式
这不是C ++解析的工作方式。c = 0
本身可能是一个表达式(如果它在允许表达式的上下文中),但这不是int c = 0;
解析方法。您必须遵循实际的C ++语法规则。
int c = 0;
是一个简单声明,包含decl-specifier-seq和可选的init-declarator-list。后者是一个或多个初始化声明项的序列。这个语法有两个组成部分:声明器和可选的初始化器。在语法上,decl-specifier-seq在哪里int
,声明器是c
组成部分,而初始化器是= 0
位。
在某些情况下,init-declarator的文本可能会被解析为expression。但是语法规则决定了解析什么。而且简单声明的语法规则不允许在decl-specifier-seq后跟expression。因此,即使可能,它后面的内容也不会被解析为表达式。
因此,即使文本看起来像它,init-declarator也不是表达式。
现在,有一个“完整表达”的概念。所谓的“完整表达式”就是初始化声明器语法。
使您感到困惑的部分是“完整表达式”和表达式之间的区别。一个表达式是一个特定片C ++语法。完整表达不是;这是一个语言概念,其中包含许多不同的语法,但是完整表达本身并不是语法。
因此,尽管语法构造init-declarator是一个“完整表达式”,但并未使其成为表达式。语法构造表达式定义明确,int c = 0;
不适合该语法。该INIT-说明符可以包含一个表达式(或多个表达式,这取决于初始值设定),但它本身不是表达。
并且只有表达式具有值类别。因此,询问不是表达式的事物的值类别不是一个有效的问题。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句