本次內容是:復合表達式的求值。尤其是 優(yōu)先級 和 結合性 部分可以作為字典查看。
1、優(yōu)先級
在表達式求解過程中,優(yōu)先級關系到表示如何分組,會影響整個表達式的值。其次是結合性,當優(yōu)先級相同時,結合性決定求解次序。算術操作符具有左結合性,即從左至右結合
3 + 2 * 3 / 2 - 1
等價于
int tmp = 2 * 3;
int tmp2 = tmp / 2;
int tmp3 = tmp2 + 3;
int result = tmp3 - 1;
括號可以改變優(yōu)先級,括號內的表達式先行計算。
2、結合性
結合性規(guī)定了具有相同優(yōu)先級的操作符如何分組。如 賦值操作符 =
具有右結合性,所以允許將多個賦值操作串連起來:
val1 = val2 = val3;
(val1 = (val2 = val3)); //與上式等價
而 算術操作符 具有右結合性:
val1 * val2 / val3;
((val1 * val2) / val3); //與上式等價
下表是按照優(yōu)先級順序給出操作符,并用空行分成不同的段,每段內的優(yōu)先級相同,且都高于后面各段的優(yōu)先級。
操作符 | 結合性 | 功能 | 用法 | ||||
---|---|---|---|---|---|---|---|
:: | L | 全局作用域 | ::name | ||||
:: | L | 類作用域 | class::name | ||||
:: | L | 名字空間作用域 | namespace::name | ||||
- | - | - | |||||
. | L | 成員選擇 | object.member | ||||
-> | L | 成員選擇 | pointer->member | ||||
[] | L | 下標 | variable[expr] | ||||
() | L | 函數(shù)調用 | name(expr_list) | ||||
() | L | 函數(shù)構造 | type(expr_list) | ||||
- | - | - | |||||
++ | R | 后自增 | lvalue++ | ||||
-- | R | 后自減 | lvalue-- | ||||
typeid | R | 類型ID | typeid(type) | ||||
typeid | R | 運行時ID | typeid(expr) | ||||
顯式強制類型轉換 | R | 類型轉換 | cast_name<type>(expr) | ||||
- | - | - | |||||
sizeof | R | 對象大小 | sizeof expr | ||||
sizeof | R | 類型大小 | sizeof(type) | ||||
++ | R | 前自增 | ++lvalue | ||||
-- | R | 前自減 | --lvalue | ||||
~ | R | 位求反 | ~expr | ||||
! | R | 邏輯非 | !expr | ||||
- | R | 一元負號 | -expr | ||||
+ | R | 一元正號 | +expr | ||||
* | R | 解引用 | *expr | ||||
& | R | 取地址 | &expr | ||||
() | R | 類型轉換 | (type)expr | ||||
new | R | 創(chuàng)建對象 | new type | ||||
delete | R | 釋放對象 | delete expr | ||||
delete[] | R | 釋放數(shù)組 | delete[] expr | ||||
- | - | - | |||||
->* | L | 指向成員操作的指針 | ptr->*ptr_to_member | ||||
.* | L | 指向成員操作的指針 | obj.*ptr_to_member | ||||
- | - | - | |||||
* | L | 乘法 | expr * expr | ||||
/ | L | 除法 | expr / expr | ||||
% | L | 求模(求余) | expr % expr | ||||
- | - | - | |||||
+ | L | 加法 | expr + expr | ||||
- | L | 減法 | expr - expr | ||||
- | - | - | |||||
<< | L | 位左移 | expr << expr | ||||
>> | L | 為右移 | expr >> expr | ||||
- | - | - | |||||
< | L | 小于 | expr < expr | ||||
<= | L | 小等于 | expr <= expr | ||||
> | L | 大于 | expr > expr | ||||
>= | L | 大等于 | expr >= expr | ||||
- | - | - | |||||
== | L | 等于 | expr == expr | ||||
!= | L | 不等于 | expr != expr | ||||
- | - | - | |||||
& | L | 位與 | expr & expr | ||||
- | - | - | |||||
^ | L | 位異或 | expr ^ expr | ||||
- | - | - | |||||
L | 位或 | expr | expr | ||||
- | - | - | |||||
&& | L | 邏輯與 | expr && expr | ||||
- | - | - | |||||
L | 邏輯或 | expr | expr | ||||
- | - | - | |||||
?: | R | 條件操作 | expr | ||||
- | - | - | |||||
= | R | 賦值操作 | lvalue = expr | ||||
*=, /=, %= | R | 復合賦值操作 | expr *= expr等 | ||||
+=, -= | R | 復合賦值操作 | expr += expr等 | ||||
<<=, >>= | R | 復合賦值操作 | expr <<= expr等 | ||||
&=, | =, ^= | R | 復合賦值操作 | expr &= expr等 | |||
- | - | - | |||||
throw | R | 拋出異常 | throw expr | ||||
- | - | - | |||||
, | R | 逗號 | expr, expr |
舉例
考慮:如果字符串不是以's'結尾則加上's',分析下列語句
string s = s + s[s.size() - 1] == 's' ? "" : "s";
分析:
根據(jù)上表知道優(yōu)先級為:.
= ()
= []
> -
= +
> ==
> ?:
> =
;可知上述語句的結合順序是
(string s = (((s + (s[(s.size()) - 1])) == 's') ? "" : "s"));
很明顯不能得到想要的結果,改成如下形式即可
string s = s + (s[s.size() - 1] == 's' ? "" : "s");
END.