標籤:c 指標 位元運算 編程
第五章 操作符和運算式
這一章如果沒做過玩過單片機、彙編的話,讀起來可能比較吃力,尤其是在移位元運算符、位元運算符應用上。另外多注意一下左值和右值的理解。
總結:
算術操作符、賦值操作符、關係操作符、條件操作符。
短路求值(short-circuited evalution):如||這樣的二目操作符,如果它的左運算元是真,右運算元便不再求值。帶來的後果是如果右運算元的數組下標不合法,那麼也不會報錯。
C並不具備顯式得布爾類型,布爾值是用整型運算式來表示的。在運算式中混用布爾值和任意的整型值可能會產生錯誤。要避免這些錯誤,每個變數要麼表示成布爾型,要麼表示成整型,不可讓它身兼兩值。不要對整形變數進行布爾測試,反之亦然。
C沒有布爾,用整數代替。0為假,非0為真。
所以有的人經常這樣:
#define FALSE 0
#define TRUE 1
..
if(flag == TRUE)...
if(flag)...
但是這樣意義不大,如果flag設定為任意的整型值,那麼第二對語句就不是等價的,只有當flag確實是True或者False才有意義。
因此如果flag你希望它來代表布爾值,就應該始終把它設定為0或者1。
左值和右值(L-value和R-value),左值往往提供一個記憶體的位置,但並不是一份拷貝。右值代表一個值,可以是一份拷貝。所以左值也可以是右值,但是右值不能成為左值。
比如:
a++ =b://wrong
b =a++; //right
a++並沒有一個記憶體位置,有人會說a++必然會存在一個記憶體的位置,但是a++的結果是a的一份拷貝,其位置不certain。所以這個不是左值。
不同類型之間的值需要轉換才能操作。
如果某個運算式過於依賴求值的順序,那麼應該儘力去避免,因為不同的編譯器會產生不同的求值順序,所以本質上運算式是不可移植的。
警告:
1、有符號值得右移位值操作時不可移植的。
這對編譯器是一個考驗,所有無符號的右移同左移一樣,他是可移植的,但是如果存在有符號位的右移位操作,如果符號位是1,右移的全是1,如果符號位是0,右移的全是0。
2、移位操作的位元是個負值。
3、連續賦值中各個變數長度不一。
4、誤用=而不是==進行比較。
太容易錯誤了,所以只要有邏輯運算式最好多看一便。
5、誤用|替代||,誤用&替代&&
位操作符,誤用80%出錯!
6、在不同的用於表示布爾值的非零值之間進行比較。
見上詳述。
7、運算式賦值的位置並不決定運算式計算的精度。
8、編寫結果依賴於求值順序的運算式。
見上!
編程提示:
1、嘗試使用以下條件操作符替代if語句以簡化運算式。
這樣帶來的優勢很明顯,當一個運算式過長的時候,?:;的組合降大大縮短長度。
2、不要混用整型和布爾值。
關於位操作符。。。。嗯嗯,以後有時間在關注它的應用。