章节目录

表达式简介

本节阅读量:

表达式

考虑以下的语句:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
// five() 是个返回 5 的函数
int five()
{
    return 5;
}

int main()
{
    int a{ 2 };             // 使用字面值常量 2 初始化 a
    int b{ 2 + 3 };         // 使用计算后的结果 5 初始化 b
    int c{ (2 * 3) + 4 };   // 使用计算后的结果 10 初始化 c
    int d{ b };             // 使用变量 b 的值初始化 d
    int e{ five() };        // 使用函数的返回值 5 初始化 e

    return 0;
}

这些语句中都定义了一个新变量,并用值对其进行初始化。请注意,上面显示的初始值使用了不同的构造方式:字面值常量、变量、运算符和函数调用。C++将所有这些不同的东西转换为单个值,然后将该值用作变量的初始化值。

这些有什么共同之处?他们使用的是表达式。

「表达式」使用字面值常量、变量、运算符和函数调用的组合来计算一个新值。执行表达式的过程称为求值,生成值称为表达式的结果。

计算表达式时,将计算表达式中的每一项,直到最终生成单个值。下面是不同类型表达式的示例,并说明如何计算的注释:

1
2
3
4
5
2               // 2是一个字面值常量,求值结果是2
"Hello world!"  // "Hello world!" 是一个字面值常量,求值结果是 "Hello world!"
x               // x 是一个变量,求值结果是 x 中存储的值
2 + 3           // 操作符 +,对2 和 3 进行求值,结果是 5
five()          // 求值结果是函数 five() 的返回值

字面值常量的计算结果是它们自己。变量计算结果是变量存储的值。操作符(如+)使用其操作数来计算值。我们还没有介绍函数调用,但在表达式的上下文中,函数调用的计算结果是函数的返回值。

涉及具有副作用的运算符的表达式稍微复杂一些:

1
2
3
x = 5           // 将 5 赋值给 x, 计算的结果是 x
x = 2 + 3       // 将 5 赋值给 x, 计算的结果是 x
std::cout << x  // 见 x 中保存的结果输出到控制台, 计算的结果是 std::cout

请注意,表达式不会以分号结尾,并且不能单独编译运行。例如,如果试图编译表达式x=5,编译器会报错(可能是因为缺少分号)。相反,表达式总是作为语句的一部分进行计算。

例如:

1
int x{ 2 + 3 }; // 2 + 3 是一个表达式,不包含分号-- 分号在语句的模块

如果要将该语句分解为其语法,它将如下所示:

1
类型 标识符 { 表达式 };

类型是任何有效的类型(int)。标识符是任何有效的名称(x)。表达式是任何有效的表达式(2+3,使用两个字面值常量和一个操作符)。


表达式语句

某些表达式(如 x = 5),其副作用很有用(将值5分配给变量x)。然而,我们上面提到,表达式不能自己执行——必须作为语句的一部分存在。那么我们如何使用这样的表达式呢?

这里很容易将任何表达式转换为等效语句。表达式语句是由表达式跟其后的分号组成的语句。执行表达式语句时,将计算表达式。

因此,我们可以使用任何表达式(例如 x = 5),并将其转换为可编译的表达式语句( x = 5 ;)。

在表达式语句中使用表达式时,将丢弃由表达式生成的返回值(因为它未被使用)。


无用的表达式语句

我们还可以生成可编译但没有效果的表达式语句。例如,表达式语句( 2 * 3;)是一个表达式语句,其表达式的计算结果为6,然后丢弃该结果值。虽然在语法上有效,但这样的表达式语句是无用的。一些编译器(如gcc和Clang)如果检测到表达式语句无用,就会产生警告。


子表达式、完整表达式和复合表达式

我们需要讨论特定类型的表达式。为此,我们将定义一些相关术语。

表达式:

1
2
3
2               // 2 是字面值常量,计算结果为 2
2 + 3           // 2 + 3 使用操作符 + ,计算结果为 5
x = 4 + 5       // 4 + 5 计算结果是 9, 然后赋值给变量 x

子表达式是用作操作数的表达式。例如,x = 4 + 5 的子表达式是 x 和 4 + 5。4 + 5 的子表达式是 4 和 5。

完整表达式是操作符加上对应的操作数。2、2 + 3 和 x = 4 + 5 都是完整表达式。

复合表达式是包含两个或多个操作符的表达式。x = 4 + 5 是一个复合表达式,因为它包含两个运算符(=和+)。2 和 2 + 3 不是复合表达式。


1.8 字面值和操作符简介

上一节

1.10 开发第一个程序

下一节