基础

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

基本概念

一元操作符、二元操作符、三元操作符

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

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

组合运算符和运算对象

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

优先级与结合律

复合表达式是指含有两个或多个运算符的表达式。求复合表达式的值需要首先将运算符和运算对象合理地组合在一起,优先级与结合律决定了运算对象的组合方式。

高优先级运算符的运算对象要比低优先级运算符的运算对象更紧密的结合,如果优先级相同,则其组合规则由组合律确定。 

求值顺序

优先级规定了运算对象的组合方式,但是并没有说明运算对象按照什么顺序求值。大多数情况下并不会明确指出求值顺序。

对于那些没有指定执行顺序的运算符来说,如果表达式指向并修改同一个对象,将会引发错误并产生未定义的行为:

int i=0;
cout<<i<<” ”<<++i<<endl;      //未定义的

编译器可能先求++i的值再求i的值,也可能先求i的值再求++i的值。因为此表达式的行为不可预知,因此不论编译器生成什么样子的代码程序都是错误的。

有4种运算符明确规定了运算对象的求值顺序:逻辑与(&&),逻辑或(||),条件运算符(?:) ,逗号运算符(,)。 

posted @ 2018-04-29 09:28  刘-皇叔  阅读(164)  评论(0)    收藏  举报