C++ Primer 第四章筆記

Chapter 4 Expressions

4.1 基礎

4.1.1 基本概念

左值和右值

​ 一個左值表達式的求職結果是一個對象或者一個函數,然而以常量對象爲代表的某些左值實際上不能作爲賦值語句的左側運算對象。當一個對象用作右值的時候,用的是對象的值(內容);當對象被用作左值的時候,用的是對象的身份(在內存中的位置)。

4.1.3 求值順序

​ 對於某些沒有執行順序的運算符來說,如果表達式指向並修改了同一個對象,將會引發錯誤併產生未定義的行爲,例如,<< 運算符沒有明確規定何時以及如何對運算對象求值,因此下面的輸出表達式是未定義的:

int i = 0;
cout << i << " " << ++i << endl;  // undefined

​ 因爲程序是未定義的,所以我們無法推斷它的行爲。

4.2 算術運算符

07

int i = 1024;
int k = -i;  // i is -1024
bool b = true;
bool b2 = -b;  // b2 is true!

​ 布爾值不應該參與運算,-b 就是一個很好的例子。

​ 對大多數運算來說,布爾類型的運算對象被提升爲 int 類型。如上所示,不二變量 b 的值爲真,參與運算時將被提升爲整數值 1,對它求負後的結果爲 -1。將 -1 再轉換爲布爾值並將其作爲 b2 的初始值,顯然這個初始值不等於 0,轉換成布爾值後應該爲 -1。所以,b2 爲真!

​ 當計算的結果超出該類型所能表示的範圍時就會產生溢出。該值會發生環繞,如:

short short_value = 32767;  // max value if shorts are 16 bits
short_value += 1;  // this calculation overflows
cout << "short_value: " << short_value << endl;

// short_value: -32768

4.8 位運算符

位運算符作用於整數類型的運算對象,並把運算對象看成是二進制的集合。位運算符提供檢查和設置二進制位的功能。如果運算對象是帶符號的且它的值是負的,那麼位運算符如何處理運算對象的 “符號位” 依賴於機器。而且,此時的左移操作可能會改變符號位的值,因此是一種未定義的行爲。

08

移位運算符

<< 運算符和 >> 運算符的內置含義是對其運算對象執行基於二進制位的移動操作,首先令左側運算對象的內容按照右側運算對象的要求移動指定位數,然後經過移動的(可能還進行了提升)左側運算對象的拷貝作爲求值結果。其中,右側運算對象一定不能爲負,而且值必須嚴格小於結果的位數,否則將會產生未定義的行爲。二進制或者向左移(<<)或者向右移(>>),移出邊界之外的位就被捨棄掉了。

09

位求反運算符

將運算對象逐位求反後生成一個新值,將 1 置爲 0、將 0 置爲 1。

位與、位或、位異或運算符

​ 在兩個運算對象上執行相應的邏輯操作:

10

4.9 sizeof 運算符

sizeof 運算符返回一條表達式或一個類型名字所佔的字節數。sizeof 運算符滿足右結合律,其所得的值是一個 size_t 類型的常量表達式:

11

​ sizeof 運算符的結果部分地依賴於其作用的類型:

12

4.11 類型轉換

何時發生隱式類型轉換

13

4.11.1 算術轉換

14

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章