第四章也是比較基礎的,在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_cast
、dynamic_cast
、const_cast
、reinterpret_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);
最後附上一張運算符優先級表
運算符優先級表