表达式简介
本节阅读量:表达式
考虑以下的语句:
|
|
这些语句中都定义了一个新变量,并用值对其进行初始化。请注意,上面显示的初始值使用了不同的构造方式:字面值常量、变量、运算符和函数调用。C++将所有这些不同的东西转换为单个值,然后将该值用作变量的初始化值。
这些有什么共同之处?他们使用的是表达式。
「表达式」使用字面值常量、变量、运算符和函数调用的组合来计算一个新值。执行表达式的过程称为求值,生成值称为表达式的结果。
计算表达式时,将计算表达式中的每一项,直到最终生成单个值。下面是不同类型表达式的示例,并说明如何计算的注释:
|
|
字面值常量的计算结果是它们自己。变量计算结果是变量存储的值。操作符(如+)使用其操作数来计算值。我们还没有介绍函数调用,但在表达式的上下文中,函数调用的计算结果是函数的返回值。
涉及具有副作用的运算符的表达式稍微复杂一些:
|
|
请注意,表达式不会以分号结尾,并且不能单独编译运行。例如,如果试图编译表达式x=5,编译器会报错(可能是因为缺少分号)。相反,表达式总是作为语句的一部分进行计算。
例如:
|
|
如果要将该语句分解为其语法,它将如下所示:
|
|
类型是任何有效的类型(int)。标识符是任何有效的名称(x)。表达式是任何有效的表达式(2+3,使用两个字面值常量和一个操作符)。
表达式语句
某些表达式(如 x = 5),其副作用很有用(将值5分配给变量x)。然而,我们上面提到,表达式不能自己执行——必须作为语句的一部分存在。那么我们如何使用这样的表达式呢?
这里很容易将任何表达式转换为等效语句。表达式语句是由表达式跟其后的分号组成的语句。执行表达式语句时,将计算表达式。
因此,我们可以使用任何表达式(例如 x = 5),并将其转换为可编译的表达式语句( x = 5 ;)。
在表达式语句中使用表达式时,将丢弃由表达式生成的返回值(因为它未被使用)。
无用的表达式语句
我们还可以生成可编译但没有效果的表达式语句。例如,表达式语句( 2 * 3;)是一个表达式语句,其表达式的计算结果为6,然后丢弃该结果值。虽然在语法上有效,但这样的表达式语句是无用的。一些编译器(如gcc和Clang)如果检测到表达式语句无用,就会产生警告。
子表达式、完整表达式和复合表达式
我们需要讨论特定类型的表达式。为此,我们将定义一些相关术语。
表达式:
|
|
子表达式是用作操作数的表达式。例如,x = 4 + 5 的子表达式是 x 和 4 + 5。4 + 5 的子表达式是 4 和 5。
完整表达式是操作符加上对应的操作数。2、2 + 3 和 x = 4 + 5 都是完整表达式。
复合表达式是包含两个或多个操作符的表达式。x = 4 + 5 是一个复合表达式,因为它包含两个运算符(=和+)。2 和 2 + 3 不是复合表达式。
