# 表达式
表达式由一个或多个 运算对象(operand) 组成对表达式求值将得到一个 结果(result)。
# 基础
# 基本概念
C++
定义了一元运算符(unary operator)和二元运算符(binary operator),分别作用于一个运算对象和两个运算对象。此外,还有三元运算符,有些运算符既是一元也是二元运算符。
对于含有多个运算符的复杂表达式,首先需要理解运算符的:优先级(precedence)、结合律(associativity)以及运算对象的求值顺序(order of evaluation)。
在表达式求值过程中,小整数类型(bool
、char
、short
)等通常会被 提升(promoted) 成较大的整数类型(int
)。
当运算符作用在类类型的运算对象时,用户可以自定定义其含义,称为 重载运算符(overloaded operator)。
C++
的表达式要不然是 右值(rvalue),要不然就是 左值(lvalue),这两个名词是从 C
继承过来的。当一个对象被用作右值的时候,用的是对象的值(内容);当对象被用作左值的时候,用的是对象的身份(在内存中的位置)。
# 求值顺序
在大多数情况下,表达式求值的顺序是没有明确指定的:
|
|
我们知道 f1
和 f2
一定会在执行乘法之前被调用,但是无法知道是 f1
先被调用还是 f2
先被调用。对于没有指定调用顺序的程序来说,如果 f1
和 f2
同时修改了同一个对象,将会引发错误并产生未定义的行为。
# 算术运算符
溢出:当计算的结果超出该类型所能表示的范围时就会产生溢出。
bool
类型不应该参与计算。
取余运算:m % n
的结果的符号与 m
相同。
# 逻辑运算符
短路求值:逻辑与运算符和逻辑或运算符都是先求左侧运算对象的值,再求右侧运算对象的值,当且仅当左侧运算对象无法确定表达式的结果时才会计算右侧运算对象的值。