C Primer 第四章筆記

2021-08-28 08:31:05 字數 2189 閱讀 5872

左值和右值

​ 乙個左值表示式的求職結果是乙個物件或者乙個函式,然而以常量物件為代表的某些左值實際上不能作為賦值語句的左側運算物件。當乙個物件用作右值的時候,用的是物件的值(內容);當物件被用作左值的時候,用的是物件的身份(在記憶體中的位置)。

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

int i =0;

cout << i <<

" "<<

++i << endl;

// undefined

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

​ 布林值不應該參與運算,-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

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

移位運算子

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

位求反運算子

將運算物件逐位求反後生成乙個新值,將 1 置為 0、將 0 置為 1。

位與、位或、位異或運算子

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

sizeof 運算子返回一條表示式或乙個型別名字所佔的位元組數。sizeof 運算子滿足右結合律,其所得的值是乙個 size_t 型別的常量表示式:

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

何時發生隱式型別轉換

C primer 第四章筆記 初稿

左值和右值 求值順序 號對布林運算無效 溢位運算 取餘運算可以為負,但不可以為浮點數 m n n m m n m n m n,m n m n 如果想右結合連續賦值,就必須滿足變數型別相同或可相互轉化 優先選擇前置遞增而不是後置遞增 後置遞增運算子優先順序高於解引用運算子 位運算存在一定的公升級擴容,...

C primer(第四章)學習筆記

第四章 表示式 1.表示式由乙個或者多個運算物件operand組成,對表示式求值將得到乙個結果result。字面值和變數是簡單的表示式expression。把乙個運算子operator和乙個或多個運算物件組合起來可以生成交複雜的表示式。一元運算子 取位址符 解引用符 二元運算子 相等運算子 乘法運算...

C PRIMER第四章練習

4.1 先乘除後加減,105 4.2a vec.begin b vec.begin 1 4.3可以接受,可以提高編譯器效率,潛在缺陷只要注意不讓表示式指向並修改同一物件就可以忽略 4.4 12 3 4 5 15 24 4 2 91 4.5a 86 b 18 c 0d 2 4.6if ival 2 為...