gpt4 book ai didi

c++ - C++ "declaration and initialization"语句是表达式吗?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:28:23 25 4
gpt4 key购买 nike

语言标准说:

[ Note: Clause 5 defines the syntax, order of evaluation, and meaning of expressions.58 An expression is a sequence of operators and operands that specifies a computation. An expression can result in a value and can cause side effects. — end note ]

例如我的代码如下:

int i=1;
A obj;

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

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

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

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

最佳答案

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

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

关于c++ - C++ "declaration and initialization"语句是表达式吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38176146/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com