编程学习biancheng.45soft.com 本站提供了各种在线教程和资料,供大家学习与参考.
编程学习
当前位置: 主页 > C++ > 表达式 >

C++ 表达式


C++ 提供了丰富的操作符,并定义操作数为内置类型时,这些操作符的含义。除此之外,C++ 还支持操作符重载,允许程序员自定义用于类类型时操作符的含义。标准库正是使用这种功能定义用于库类型的操作符。


本章重点介绍 C++ 语言定义的操作符,它们使用内置类型的操作数;本章还会介绍一些标准库定义的操作符。第十四章将学习如何定义自己的重载操作符。


表达式由一个或多个操作数通过操作符组合而成。最简单的表达式仅包含一个字面值常量或变量。较复杂的表达式则由操作符以及一个或多个操作数构成。


每个表达式都会产生一个结果。如果表达式中没有操作符,则其结果就是操作数本身(例如,字面值常量或变量)的值。当一个对象用在需要使用其值的地方,则计算该对象的值。例如,假设ival是一个int型对象:

if (ival)            // evaluate ival as a condition
// ....


上述语句将 ival 作为 if 语句的条件表达式。当 ival 为非零值时, if 条件成立;否则条件不成立。


对于含有操作符的表达式,它的值通过对操作数做指定操作获得。除了特殊用法外,表达式的结果是右值(第 2.3.1 节),可以读取该结果值,但是不允许对它进行赋值。


操作符的含义——该操作符执行什么操作以及操作结果的类型——取决于操作数的类型。


除非已知道操作数的类型,否则无法确定一个特定表达式的含义。下面的表达式

i + j

既可能是整数的加法操作、字符串的串接或者浮点数的加法操作,也完全可能是其他的操作。如何计算该表达式的值,完全取决于 i 和 j 的数据类型。


C++提供了一元操作符和二元操作符两种操作符。作用在一个操作数上的操作符称为一元操作符,如取地址操作符(&)和解引用操作符(*);而二元操作符则作用于两个操作数上,如加法操作符(+)和减法操作符(-)。除此之外,C++ 还提供了一个使用三个操作数的三元操作符(ternary operator),我们将在第 5.7 节介绍它。


有些符号(symbols)既可表示一元操作也可表示二元操作。例如,符号 * 既可以作为(一元)解引用操作符,也可以作为(二元)乘法操作符,这两种用法相互独立、各不相关,如果将其视为两个不同的符号可能会更容易理解些。对于这类操作符,需要根据该符号所处的上下文来确定它代表一元操作还是二元操作。


操作符对其操作数的类型有要求,如果操作符应用于内置或复合类型的操作数,则由C++语言定义其类型要求。例如,用于内置类型对象的解引用操作符要求其操作数必须是指针类型,对任何其他内置类型或复合类型对象进行解引用将导致错误的产生。


对于操作数为内置或复合类型的二元操作符,通常要求它的两个操作数具有相同的数据类型,或者其类型可以转换为同一种数据类型。关于类型转换,我们将在第 5.12 节学习。尽管规则可能比较复杂,但大部分的类型转换都可按预期的方式进行。例如,整型可转换为浮点类型,反之亦然,但不能将指针类型转换为浮点类型。


要理解由多个操作符组成的表达式,必须先理解操作符的优先级、结合性和操作数的求值顺序。例如,表达式

5 + 10 * 20/2;

使用了加法、乘法和除法操作。该表达式的值取决于操作数与操作符如何结合。例如,乘法操作符 * 的操作数可以是 10 和 20,也可以是 10 和 20 /2,或者 15 和 20 、 15 和 20/2。结合性和优先级规则规定了操作数与操作符的结合方式。在 C++ 语言中,该表达式的值应是 105,10 和 20 先做乘法操作,然后其结果除以 2,再加 5 即为最后结果。


求解表达式时,仅了解操作数和操作符如何结合是不足够的,还必须清楚操作符上每一个操作数的求值顺序。每个操作符都控制了其假定的求值顺序,即,我们是否可以假定左操作数总是先于右操作数求值。大部分的操作符无法保证某种特定的求值次序,我们将于第 5.10 节讨论这个问题。

C++
C++ 表达式