C++表达式

在C++中,表达式是由操作数(operands)和运算符(operators)组成的组合,用于计算某个值。操作数可以是变量、字面值(literals)或函数调用,而运算符指示了执行的操作。表达式可以简单,例如2 + 3,也可以复杂,包括多个嵌套的运算符和操作数。

考虑以下一系列代码:

// 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 };             // 使用变量值 5 初始化变量 d
    int e{ five() };        // 使用函数返回值 5 初始化变量 e

    return 0;
}

每个语句都定义了一个新变量,并用一个值初始化它。请注意,上面显示的初始值使用了各种不同的构造:字面值、变量、运算符和函数调用。不过,不管这些构造有多不同,C++都将它们转换成一个单一的值,然后用作变量的初始化值。

这些构造有什么共同之处呢?它们都使用了一个表达式。

表达式是字面值、变量、运算符和函数调用的组合,用于计算一个单一的值。执行表达式的过程称为求值,产生的单一值称为表达式的结果。

当计算表达式时,表达式中的每一项都会被计算,直到剩下一个值。以下是不同类型表达式的一些示例:

2 // 2 是一个字面值,计算为值 2
"Hello world!" // "Hello world!" 是一个字面值,计算为文本 "Hello world!"
x // x 是一个变量,计算为 x 的值
2 + 3 // operator+ 使用操作数 2 和 3 计算为值 5
five() // 计算为函数 five() 的返回值

正如你所看到的,字面值计算为它们自己的值。变量计算为变量的值。运算符(例如 operator+)使用它们的操作数计算为其他值。虽然我们还没有讨论函数调用,但在表达式的上下文中,函数调用计算为函数返回的值。

涉及具有副作用的运算符的表达式有点棘手:

x = 5 // x = 5 计算结果为 x,具有将 5 赋给 x 的副作用,计算结果是 x
x = 2 + 3 // 具有将 5 赋给 x 的副作用,计算结果为 x
std::cout << x // 具有将 x 的值打印到控制台的副作用,计算结果为 std::cout

请注意,表达式不以分号结束,也不能单独编译。例如,如果你尝试编译表达式 x = 5,你的编译器会报错(可能是关于缺少分号的错误)。相反,表达式总是作为语句的一部分来进行评估。

例如,看看这个语句:

int x{ 2 + 3 }; // 2 + 3 是一个表达式,没有分号 -- 分号在包含表达式的语句的末尾

如果你要将这个语句拆解成其语法结构,它会像这样:

type identifier { expression };

其中,type 可以是任何有效的类型(我们选择了 int)。identifier 可以是任何有效的名称(我们选择了 x)。而 expression 可以是任何有效的表达式(我们选择了 2 + 3,其中使用了两个字面量和一个操作符)。

表达式语句

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

幸运的是,将任何表达式转换为等效语句都很容易。表达式语句是由表达式后跟分号组成的语句。当执行表达式语句时,将对表达式求值。

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

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

无用的表达式语句

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

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

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

考虑以下表达式:

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 是一个复合表达式,因为它包含两个操作符的使用(operator= 和 operator+)。2 和 2 + 3 不是复合表达式。

原创文章,作者:jkhxw,如若转载,请注明出处:https://www.jkhxw.com/cpp-expressions/

(0)
上一篇 2023年10月1日
下一篇 2023年10月1日

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注