1. 程式人生 > >C符號之邏輯運算子 左移與右移 自增自減

C符號之邏輯運算子 左移與右移 自增自減

               

本篇文章將總結C中一些比較有趣的符號

邏輯運算子:“ || ”“ && ” 是比較常用的邏輯運算子,分別是

或(||):雙目運算子。兩者中任一為真即為真。

與( &&):雙目運算子。兩者都為真時才為真,任一為假即為假。

但是,這兩個運算子都有一個有趣的地方。請看下面的例子:

int    a=0, b=1;if( b++ || ++a ){     printf("%d", a);}

編譯通過。執行結果是  0 。

這就奇怪了。 || 不是判斷兩個數是否為真嗎?沒錯,確實是判斷了,但是這裡只是判斷了前面的一個,因為檢查到前者為真了,所以後者就不檢查了,不檢查也即不執行了

。因為 ” ||只需兩者任一為真就為真。所以直接執行判斷前者,如果為假才再去執行後者進行判斷。哈哈,是不是很聰明呢?(其實是太懶了)

同樣,對於 ” &&也是這樣。也可以試試執行下面這例子。 

int    a=0, b=1;if( ! ( a && ++b) ){     printf("%d", b);} 
左移(<<)與右移(>>):

兩者都為雙目運算子。兩者在移位時都遵循各自的特點。

“<<”:移動時,高位丟棄,地位補0。

“>>”:移動時,對於有符號數,其符號位將隨同移動。當為整數時,最高位補0;而為負數時,符號位為 1,最高位是補 0 或是補 1 取決於編譯系統的規定

在這個運算子的學習過程中,我結合了前面的大端、小端模式。這是計算機儲存資料的模式。通過測試後,本人的計算機為小端模式。並結合小端模式和左移、右移運算子的知識。發覺資料儲存模式並不會影響左移、右移運算子的操作。這就衍生了一個新的問題,大端、小端模式對什麼有影響?在什麼情況下有影響?

下面來看看一個例子:

0x01<<2+3
不要驚訝,結果是32,因為優先順序的問題,+ 比 << 優先順序要高

那這兩個呢?

0x01<<2+30;0x01<<2-3;
編譯執行,是不行的,因為
  1. 左移和右移的位數是不能超出資料的長度
  2. 也不能小於0

自增(++)與自減(— —):

a ++:先用再加

++ a:先加再用

自減運算子同樣。

這兩點太基礎了,也太普通了。下面我們來看點有意思點的。

int    a=1, b=1;printf("%d", a+++b);   //語句 1
語句 1 是什麼意思?呵呵,這裡就要說說 貪心法 了。

C語言有這樣一個規則:每一個符號應該包含儘可能多的字元。也就是說,編譯器將程式分解成符號的方法是,從左到右一個一個字元的讀入,如果該字元可能組成一個符號,那麼再讀入下一個字元時,判斷已經讀入的兩個字元組成的字串是否可能是一個符號的組成部分;如果可能,繼續讀入下一個字元,重複上述判斷,直到讀入的字元組成的字串已不再可能組成一個有意義的符號。這個處理的策略被稱為 “貪心法”

現在我們知道C語言有這樣的規則,對 語句 1 的意思也有明白了。沒錯,a+++b 等於a++ + b

如果是換成這樣子呢?a+++++b?又會怎樣?

編譯不通過。我們換種寫法,改為a+++ ++b。這個時候編譯通過了!這裡我們再次根據”貪心法“去思考這個問題。就恍然大悟了!

這裡也總結了一件事,理論還是理論。即使你明白,理解。但是沒有經過實踐的話,是不會掌握的!就如  a+++++b  一樣,你不去實踐,按照理論去想的話。肯定能編譯通過的,但是你實踐了,才知道是錯誤的。