声明并初始化的语句能不能算一个"表达式"? 为何

C++语言 码拜 9年前 (2016-04-04) 1210次浏览
语言标准的第五章开明宗义的说:

[ 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 ]

本人的理解是,一个expression定义了一个”computation”,也就是可以计算的东西。
那么初始化语句

int i=1;
A obj;

上面两句能算是表达式吗? 定义一个变量1,给它一个初始值,这个编译出来是有”代码”的,要运行时”执行”, 算不算一个表达式?
A obj声明一个实例,构造函数做了某些事情,这个是computation吗,算不算一个表达式?
谢谢

解决方案

5

C++中的语句大体分为六种类型
声明语句,包括你说的那些定义语句
表达式语句:就是标准里说的由运算符和元素数组合成的computation
下面这些就是程序流控制的了
选择语句:
循环语句:
跳转语句:
最后还有一个
复合语句:
最后要说明的是,C++中的赋值语句和函数调用语句都属于表达式语句

5

表达式可以在函数调用时作为参数的,所以变量定义语句不是表达式;
不用太纠结这个了

10

1

你非要抠字眼的话

int i = 1;

中 int 既不是 operator 也不是 operand
而 An expression is a sequence of operators and operands that specifies a computation.
故它不是 expression

5

An expression is a sequence of operators and operands that specifies a computation.
表达式是操作数与操作符的序列。
你这两个都是声明/定义,不是表达式。

5

原因是对象本来就是在上下文中创建的,没必要把更复杂的表达式求值逻辑牵扯进来。
题外话,另一方面C++里的确有把作用域内的对象别名逻辑和更复杂的作用域间的对象身份传递揉在一起的反面例子…

2

最新c++表示233,可以这么写:

if(auto a = b) {
  
}

2

引用:

最新c++表示233,可以这么写:

if(auto a = b) {
  
}

The value of a condition that is an initialized declaration in a statement other than a switch statement is the value of the declared variable contextually converted to bool
并不是表达式逻辑,而且即便if里写的是表达式也不是普通的表达式逻辑,还有一个隐式的bool显示转换(…)

2

本人在想,是又怎么样,不是又怎么样,何编程有卵的关系吗

2

引用:
Quote: 引用:

最新c++表示233,可以这么写:

if(auto a = b) {
  
}

The value of a condition that is an initialized declaration in a statement other than a switch statement is the value of the declared variable contextually converted to bool
并不是表达式逻辑,而且即便if里写的是表达式也不是普通的表达式逻辑,还有一个隐式的bool显示转换(…)

有没有把这个隐式转换显式化的方法呢?这样是非法的:

    int b = 5;
    if (static_cast<bool>(auto a = b)) {
    }

2

引用:
Quote: 引用:
Quote: 引用:

最新c++表示233,可以这么写:

if(auto a = b) {
  
}

The value of a condition that is an initialized declaration in a statement other than a switch statement is the value of the declared variable contextually converted to bool
并不是表达式逻辑,而且即便if里写的是表达式也不是普通的表达式逻辑,还有一个隐式的bool显示转换(…)

有没有把这个隐式转换显式化的方法呢?这样是非法的:

    int b = 5;
    if (static_cast<bool>(auto a = b)) {
    }

不知道,至少想不到有这种需求的场景。上下文已经有显式需要bool的语义了。

2

引用:
Quote: 引用:
Quote: 引用:
Quote: 引用:

最新c++表示233,可以这么写:

if(auto a = b) {
  
}

The value of a condition that is an initialized declaration in a statement other than a switch statement is the value of the declared variable contextually converted to bool
并不是表达式逻辑,而且即便if里写的是表达式也不是普通的表达式逻辑,还有一个隐式的bool显示转换(…)

有没有把这个隐式转换显式化的方法呢?这样是非法的:

    int b = 5;
    if (static_cast<bool>(auto a = b)) {
    }

不知道,至少想不到有这种需求的场景。上下文已经有显式需要bool的语义了。

有时候就有:if((auto a = b) && (auto c = d))
但就如本帖子讨论的主题一样,这不是表达式,所以这个非法语句, 然后就要分成三行写….有点蛋疼

2

引用:
Quote: 引用:
Quote: 引用:
Quote: 引用:
Quote: 引用:

最新c++表示233,可以这么写:

if(auto a = b) {
  
}

The value of a condition that is an initialized declaration in a statement other than a switch statement is the value of the declared variable contextually converted to bool
并不是表达式逻辑,而且即便if里写的是表达式也不是普通的表达式逻辑,还有一个隐式的bool显示转换(…)

有没有把这个隐式转换显式化的方法呢?这样是非法的:

    int b = 5;
    if (static_cast<bool>(auto a = b)) {
    }

不知道,至少想不到有这种需求的场景。上下文已经有显式需要bool的语义了。

有时候就有:if((auto a = b) && (auto c = d))
但就如本帖子讨论的主题一样,这不是表达式,所以这个非法语句, 然后就要分成三行写….有点蛋疼

这和显式转换没关系啊。
语言总归不会去满足全部需求,例如本人还希望for初始化里能定义不同类型的变量呢,然而做标准的觉得不普遍之类不鸟也没办法。


CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明声明并初始化的语句能不能算一个"表达式"? 为何
喜欢 (0)
[1034331897@qq.com]
分享 (0)