初始化声明符是prvalue表达式吗

杰克X
int c = 0;

考虑到上面的代码,c = 0由于以下规则,它是一个init声明符,也是一个表达式:

init-declarator:
声明程序初始化器(opt)

一个全表达式为:
[...]
INIT-声明符或MEM-初始化,包括初始化的组成表达式

只要一个表达式,它就会有一个值类别。

prvalue是一个表达式,其求值初始化一个对象或位域,或计算一个运算符的操作数的值,该值由其出现的上下文指定。

的评估a = 0将初始化对象a。因此,完整表达式c=0是prvalue表达式吗?如果我误解了,请更正我。

尼科尔·波拉斯(Nicol Bolas)

考虑上面的代码,其中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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

是否可以使用Kotlin将对象表达式用于AsyncTask声明/初始化?

如何使用新运算符在表达式中聚合初始化STL容器?

索引字符串文字是初始化程序常量表达式吗?

使用正则表达式初始化地图

后缀表达式(类型名称){初始化列表}

在lambda表达式类被初始化?

奇怪的数组初始化表达式?

Lambda表达式初始化数组

如何用逻辑表达式初始化布尔?

PHP:使用表达式初始化数组

正则表达式初始化问题

将表达式传递给初始化程序

带有表达式的C ++初始化列表

在 for 循环的初始化表达式中声明的变量是否总是在词法上位于主体内部

使用boost :: assign :: list_of进行声明时,不能由非常量表达式初始化

当规则说初始化的完整表达式时,这是完整表达式

Setenv:类型表达式列表在初始化程序中被视为复合表达式

错误:表达式列表在初始化器中被视为复合表达式 [-fpermissive]|

为什么“标识符:表达式”形式的指定初始化在 GCC 中被弃用/废弃?

初始化表达式是D中构造函数的一部分吗?

C ++ 11-引用的初始化不是表达式的一部分吗?

不可为空的变量 '_preferences' 必须被初始化。尝试添加初始化表达式

为什么不捕获使用lambda表达式初始化的非捕获表达式树?

用模式vs编译的正则表达式C#初始化正则表达式

模板函数中的 C++ 初始化 - 将新的 Initializer 表达式列表视为复合表达式

C++ 套接字错误(新的初始化表达式列表被视为复合表达式)

必须初始化不可为空的实例字段 _repository。尝试添加初始化表达式,或在此构造函数中添加字段初始化

它是C的声明和初始化语句中的逗号运算符吗?

单个声明中多个声明符的初始化顺序