是C ++"声明和初始化"陈述,一个表达?

时间:2016-07-04 02:23:34

标签: c++ initialization expression declaration

语言标准说:

  

[注意:第5条定义了语法,评估顺序和含义   表达式是一系列运算符和   指定计算的操作数。表达式可以导致a   价值,可能会导致副作用。 - 结束说明]

E.g。我的代码如下:

int i=1;
A obj;

所以,上面的两个陈述都算作"表达式"?

stackoverflow上的一些人说" int i = 1;"不是表达。这对我来说很奇怪。

(1)初始化是一种"计算"对吧?所以它应该被视为"表达"?

(2)一个obj; //调用一个ctor。 ctor是一种计算,因此它应该被视为"表达"?

1 个答案:

答案 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

在阅读标准时,您需要考虑上下文,以便弄清楚“表达”的意义。