语言标准说:
[注意:第5条定义了语法,评估顺序和含义 表达式是一系列运算符和 指定计算的操作数。表达式可以导致a 价值,可能会导致副作用。 - 结束说明]
E.g。我的代码如下:
int i=1;
A obj;
所以,上面的两个陈述都算作"表达式"?
stackoverflow上的一些人说" int i = 1;"不是表达。这对我来说很奇怪。
(1)初始化是一种"计算"对吧?所以它应该被视为"表达"?
(2)一个obj; //调用一个ctor。 ctor是一种计算,因此它应该被视为"表达"?
答案 0 :(得分:5)
标准中的非规范性说明旨在激发表达的概念,但不是实际的定义。 表达式的定义在语法语法中给出,该语法语法在第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)
声明可以评估表达式,但声明不是表达式。您正确地指出类类型对象的声明可以导致构造函数调用。它在语法上仍然是一个声明,而不是表达。
然而,另一种意义上,声明是表达式。也就是说,关于表达式中的评估顺序的规则也适用于声明。例如,有一条规则是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
在阅读标准时,您需要考虑上下文,以便弄清楚“表达”的意义。