C++ primer第四章學習筆記(表達式,運算符優先級,強制類型轉換)

第四章也是比較基礎的,在c語言裏面也用到很多,除了這個優先級問題,我反正每次都老實打括號。。。。
這一章就按知識點總結好了,有些會的就不想寫了

左值和右值

在編譯的時候可能會出現這種錯誤,下面這種是左值錯誤,還有一種是右值錯誤
error: lvalue required as left operand of assignment
當一個對象被用作右值的時候,用的是對象的值(內容),當對象被用作左值的時候,用的是對象的身份(在內存中的位置)。

求值順序

很多人會誤以爲是結合律或者是優先級(其中也包括我),但是其實運算對象的求值順序與優先級和結合律無關,對於沒有規定求值順序的運算符,如果表達式指向並修改同一對象,則可能會引發錯誤併產生未定義的行爲,如

int i=0;
cout << i <<" "<< ++i <<endl;	//錯誤:未定義行爲

因爲編譯器可能先求i的值再求i++,結果輸出0,1;也可能先求i++的值再求i的值,結果輸出1,1。因此表達式的行爲不可預知。

有四種運算符規定了運算對象的求值順序&& || ? : ,

遞增運算符和遞減運算符

對於前置遞增(遞減)和後置遞增(遞減)有很多人會搞混

int i=0,j;
j=++i;	//j=1,i=1:前置得到的是遞增之後的值,先計算i++,然後j=i
j=i++;	//j=1,j=2:後置得到的是遞增之前的值,先計算j=i,然後i++

位運算符

這個還是再拿出來說一下好了,因爲在做課後習題的時候,4.25題發現了兩個版本的答案

4.25 如果一臺機器上int佔32位,char佔8位,用的是Latin-1字符集,其中字符‘q’的二進制形式是0111 0001,那麼表達式~‘q’<<6的值是什麼?

運算符~的優先級高於運算符<<的優先級,由於是求值所有最後結果應該是int型,所以先執行 ~‘q’
‘q’ :0000 0000 0000 0000 0000 0000 0111 0001
~‘q’:1111 1111 1111 1111 1111 1111 1000 1110
~‘q’<<6: 1111 1111 1111 1111 1110 0011 1000 0000
由於是有符號數,所以最高位是符號位,答案是-7296

類型轉換

這裏介紹顯式轉換
命名的強制類型轉換有如下形式
cast-name<type>(expression)
type是轉換的目標類型,expression是要轉換的值,cast-name是static_castdynamic_castconst_castreinterpret_cast

danamic_cast支持運行時類型識別,將在後面的章節介紹

static_cast: 任何具有明確定義的類型轉換,不包括底層const指針(指針所指對象是常量)
double k=static_cast<double(j)/i;>

const_cast: 只能改變運算對象的底層指針
const char * pc;
char *p = const_cast<char*>(pc);

reinterpret_cast: 通常爲運算對象的位模式提供較低層次上的重新解釋
int *ip;
char *pc = reinterpret_cast<char *> (ip);

最後附上一張運算符優先級表
運算符優先級表

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