【问题标题】:Is C++ "declaration and initialization" statement, an expression?C ++“声明和初始化”语句是表达式吗?
【发布时间】:2016-07-04 02:23:34
【问题描述】:

语言标准说:

[ 注意:第 5 条定义了语法、评估顺序和含义 58 表达式是一系列运算符和 指定计算的操作数。表达式可以导致 价值并可能导致副作用。 ——尾注]

例如我的代码如下:

int i=1;
A obj;

那么,以上两个语句都算作“表达式”吗?

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

(1) 初始化是一种“计算”,对吧?所以应该算是“表达”吧?

(2) 一个对象; //调用一个ctor。 ctor是一种计算,所以它应该被视为“表达式”?

【问题讨论】:

  • 一个简单的经验法则是表达式没有分号。添加分号会将它们变成语句。此外,表达式是可以用括号括起来并在另一个表达式中使用的东西。你不能写x = (int i=1;)
  • 检查语法,我这里提取出来了:github.com/o11c/chintzy/blob/master-py/chintzy/_std/…
  • @KeithThompson:42literal,这是 primary-expression。我不知道你为什么认为它不是。该注释是非规范性的,并且没有定义表达式。
  • @MSalters:你是对的。我没有注意到该注释是非规范性的。 (C标准有类似的措辞,是“表达式”的规范定义。)我将删除我之前的评论。

标签: c++ initialization expression declaration


【解决方案1】:

标准中的非规范性注释旨在激发表达式的概念,但不是实际定义。 expression 的定义在第 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

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

【讨论】:

  • 声明不是表达式;一些“完整表达式”不是表达式。标准应该每次都使用“full-expression”来表示完整的表达
  • 其实A(i);是一个声明。
  • @VaughnCato 我的错,会解决的。
  • @VaughnCato 你能确认A(i); 是一个声明吗?我到处打猎,我无法确认。具体来说,我目前的理解是声明必须将名称引入范围,A(i); 似乎并非如此。
  • @DanNissenbaum:A(i);A i; 相同,例如:godbolt.org/g/kz34Fi
猜你喜欢
  • 2017-01-18
  • 2023-02-01
  • 2022-01-17
  • 1970-01-01
  • 2014-07-30
  • 1970-01-01
  • 1970-01-01
  • 2020-01-20
  • 2010-12-03
相关资源
最近更新 更多