第四章 表達式
表達式由一個或多個運算對象組成,對錶達式求值將得到一個結果。字面值和變量時最簡單的表達式,其結果就是字面值和變量的值。把一個運算符和一個或多個運算對象結合起來可以生成複雜的表達式。
4.1 基礎
4.1.1 基本概念
- 組合運算符和運算對象
對於含有多個運算符的複雜表達式來說,要想理解他的含義首相要理解運算符的優先級、結合律以及運算對象的求值順序。 - 運算對象轉換
運算對象常常由一個類型轉換成另外一種類型。 - 重載運算符
對已經存在的運算符賦予自定義的意義 - 左值和右值
4.1.2 優先級與結合律
- 括號無視優先級與結合律
- 優先級與結合律有何影響
結合律對錶達式產生影響的一個典型示例是輸入輸出運算。
4.1.3 求值順序
這部分需要參考加減乘除等運算的先後順序,在此不做說明。
4.2 運算符
- 算術運算符
4.3 邏輯和關係運算符
- 邏輯與和邏輯或運算符
- 邏輯與 :當且僅當兩個運算對象都爲真時結果爲真
- 邏輯或 :只要兩個運算對象中的一個爲真結果就爲真
短路求值:
- 對於邏輯與運算符來說,當且僅當左側運算對象爲真時纔對右側運算對象求值。
- 對於邏輯或運算符來說,當且僅當左側運算對象爲假時纔對右側運算對象求值。
- 邏輯非運算符
邏輯非(!)運算符 將運算對象的值取反後返回。 - 關係運算符
4.4 賦值運算符
- 賦值運算滿足右結合律
int iVal,jVal;
iVal=jVal=0;
- 賦值運算優先級較低
- 切勿混淆相等運算符和賦值運算符
if(i=j) //賦值運算符
if(i==j) //相等運算符
// 用相等運算符時 建議把數值寫在等式左邊
- 複合賦值運算符
4.5 遞增和遞減運算符
++i :先增加再使用
i++: 先使用後增加
4.6 成員訪問運算符
obj.mem: 對象的實例訪問成員用點運算符
pObj->mem: 對象實例的指針訪問成員用->
4.7 條件運算符
cond ? expr1 : expr2;
4.8 位運算符
- 移位運算符
<<:左移; <<:右移
左移運算符<< 在右側插入值爲0的二進制位。
右移運算符>> 的行爲則依賴於左側運算對象的類型:
- 如果該運算對象爲無符號類型,在左側插入值爲0的二進制位
- 如果該運算對象是帶符號類型,在左側插入符號位的副本或值爲0的二進制位,如果選擇要視環境而定
- 位求反運算符
位求反運算符(~) 將運算符對象逐位求反後生成一個新值,將1置爲0、將0置爲1 - 位與、位或、位異或運算符
4.9 sizeof運算符
sizeof運算符返回一條表達式或一個類型名字所佔的字節數。
#include <iostream>
using namespace std;
struct Sales_data
{
int bookNo;
unsigned units_sold = 0;
double revenue = 0.0;
};
int main()
{
Sales_data data, *p;
cout << "Sales_data sizeof:" << sizeof(Sales_data) << endl;
cout << "data sizeof:" << sizeof data << endl;
cout << "p sizeof:" << sizeof p << endl;
cout << "*p sizeof:" << sizeof *p << endl;
cout << "data.revenue sizeof:" << sizeof data.revenue << endl;
return 0;
}
結果:
Sales_data sizeof:16
data sizeof:16
p sizeof:4
*p sizeof:16
data.revenue sizeof:8
個類型具體佔用幾個字節是與環境有關的,不同的機器顯示會有出入,不用糾結。
4.10 逗號運算符
逗號運算符:含有兩個運算對象,按照從左向右的順序依次求值。
對於逗號運算符來說:
- 首先對左側的表達式求值,然後將求值結果丟棄掉。逗號運算符真正的結果是右側表達式的值。
- 如果右側運算對象是左值,那麼最終的求值結果也是左值。
4.11 類型轉換
4.11.1 算術轉換
算術轉換:把一種算術類型轉換成另外一種算術類型。算術轉換的規則定義了一套類型轉換的層次,其中運算符的運算對象將轉換成最寬的類型。
- 整型提升
負責把小整數類型轉換成較大的整數類型。 - 無符號類型的運算對象
- 若果一個運算對象是無符號類型、另外一個運算對象是帶符號類型,而且其中的無符號類型不小於帶符號類型,那麼帶符號的運算對象轉換成無符號的。
- 如果帶符號類型大於無符號類型,此時轉換的結果依賴於機器。
4.11.2 其他隱式類型轉換
- 數組轉換成指針
- 轉換成bool類型
- 轉換成常量
- 等等
4.11.3 顯示轉換
就是運用函數進行轉換
- static_cast
只要不包含底層const,都可以使用。 - dynamic_cast
支持運行時類型識別 - const_cast
只能改變運算對象的底層const - reinterpret_cast
通常爲運算對象的位模式提供較低層次的重新解釋
4.12 運算符優先級表
百度一下你就知道