考虑上述代码,其中的c = 0是一个init-declarator,也是一个表达式。
这不是C++解析工作的方式。 c = 0本身可能是一个表达式(如果它在允许表达式的上下文中),但这不是int c = 0;的解析方式。您必须遵循实际的C++语法规则。
int c = 0;
是一个简单声明,包含一个decl-specifier-seq和一个可选的init-declarator-list。后者是一个或多个init-declarator术语的序列。这个语法有两个组成部分:一个declarator和一个可选的initializer。从语法上讲,decl-specifier-seq是int
所在的位置,declarator是c
部分,initializer是= 0
部分。
init-declarator中的文本在某些情况下可能被解析为expression。但是,解析成什么取决于语法规则。而simple-declaration的语法规则不允许在decl-specifier-seq之后紧跟expression。因此,即使可以解析为expression,其后面的内容也不会被解析为expression。
因此,即使文本看起来像是expression,init-declarator也不是expression。
现在,有一个"full-expression"的概念。其中一个被称为"full-expressions"的东西就是init-declarator语法。
你所困惑的部分在于“完整表达式”和“表达式”的区别。一个“表达式”是C ++语法的
特定部分。完整表达式则不是;它是一种语言概念,包括许多不同的语法结构,但完整表达式本身并不是语法。
因此,虽然语法结构“init-declarator”是一个“完整表达式”,但这并不意味着它是一个“表达式”。语法结构“表达式”是被明确定义的,而“int c = 0;”并不符合这个语法。 “init-declarator”可以包含一个或多个表达式(取决于初始化程序),但它本身不是一个表达式。
只有“表达式”才有值类别。因此,询问一个不是“表达式”的东西的值类别是无效的问题。