标准中的非规范性注释旨在激发表达式的概念,但不是实际的定义。的定义表达是在第 5 节剩余部分中给出的语言语法中给出的。表达式是由某些终结符(例如文字、变量名称和函数名称)构建的,它们使用算术运算符和关系运算符等运算符进行组合。
声明和表达式是不同的语法实体,因此 C++ 程序中的声明永远不是表达式,并且反之亦然。差异一目了然:如果它声明了什么,那么它就是一个声明。
1; // expression statement
int i = 1; // declaration statement that declares `i`
A(i, 42); // expression statement that creates an A object
A a(i); // declaration statement that declares an A object (named a)
声明可以evaluate表达式但声明is not一种表达。您正确地指出,类类型的对象的声明可能会导致构造函数调用。从语法上讲,它仍然是一个声明,而不是一个表达式。
然而,还有另一种意义,即声明is一种表达。即,有关表达式内求值顺序的规则也适用于声明。例如,有一条规则,后缀增量对int
发生在完整表达式结束之前的某个时刻。
f(i++) + g(); // i may be incremented before or after g() is called...
h(); // but definitely before h() is called.
出于此类规则的目的,单个变量的声明和初始化也被视为完整表达式。对于类类型变量,构造函数调用是该表达式的一部分。
int i = 1; // this declaration evaluates a full-expression
// whose effect is to initialize `i` to 1
int j = f(i++) + g(), k = h(); // two separate full-expressions;
// i is incremented before h() is called
阅读标准时,您需要考虑上下文才能弄清楚“表达”的含义。