本篇文章將總結c中一些比較有趣的符號
邏輯運算子:「 || 」與「 && 」是比較常用的邏輯運算子,分別是或和與。
或(||):雙目運算子。兩者中任一為真即為真。
與(&&):雙目運算子。兩者都為真時才為真,任一為假即為假。
但是,這兩個運算子都有乙個有趣的地方。請看下面的例子:
int a=0, b=1;if( b++ || ++a )
編譯通過。執行結果是 0 。
這就奇怪了。」 || 「不是判斷兩個數是否為真嗎?沒錯,確實是判斷了,但是這裡只是判斷了前面的乙個,因為檢查到前者為真了,所以後者就不檢查了,不檢查也即不執行了。因為」 ||「只需兩者任一為真就為真。所以直接執行判斷前者,如果為假才再去執行後者進行判斷。哈哈,是不是很聰明呢?(其實是太懶了)
同樣,對於」 && 「也是這樣。也可以試試執行下面這例子。
int a=0, b=1;if( ! ( a && ++b) )
左移(<<)與右移(>>):兩者都為雙目運算子。兩者在移位時都遵循各自的特點。
「<<」:移動時,高位丟棄,地位補0。
「>>」:移動時,對於有符號數,其符號位將隨同移動。當為整數時,最高位補0;而為負數時,符號位為 1,最高位是補 0 或是補 1 取決於編譯系統的規定。
在這個運算子的學習過程中,我結合了前面的大端、小端模式。這是計算機儲存資料的模式。通過測試後,本人的計算機為小端模式。並結合小端模式和左移、右移運算子的知識。發覺資料儲存模式並不會影響左移、右移運算子的操作。這就衍生了乙個新的問題,大端、小端模式對什麼有影響?在什麼情況下有影響?
下面來看看乙個例子:
0x01
<<2+3
不要驚訝,結果是32,因為優先順序的問題,+ 比 << 優先順序要高
那這兩個呢?
0x01
<<2+30;0x01
<<2
-3;
編譯執行,是不行的,因為
左移和右移的位數是不能超出資料的長度也不能小於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 一樣,你不去實踐,按照理論去想的話。肯定能編譯通過的,但是你實踐了,才知道是錯誤的。
本篇文章將總結c中一些比較有趣的符號
邏輯運算子:「 || 」與「 && 」是比較常用的邏輯運算子,分別是或和與。
或(||):雙目運算子。兩者中任一為真即為真。
與(&&):雙目運算子。兩者都為真時才為真,任一為假即為假。
但是,這兩個運算子都有乙個有趣的地方。請看下面的例子:
int a=0, b=1;if( b++ || ++a )
編譯通過。執行結果是 0 。
這就奇怪了。」 || 「不是判斷兩個數是否為真嗎?沒錯,確實是判斷了,但是這裡只是判斷了前面的乙個,因為檢查到前者為真了,所以後者就不檢查了,不檢查也即不執行了。因為」 ||「只需兩者任一為真就為真。所以直接執行判斷前者,如果為假才再去執行後者進行判斷。哈哈,是不是很聰明呢?(其實是太懶了)
同樣,對於」 && 「也是這樣。也可以試試執行下面這例子。
int a=0, b=1;if( ! ( a && ++b) )
左移(<<)與右移(>>):兩者都為雙目運算子。兩者在移位時都遵循各自的特點。
「<<」:移動時,高位丟棄,地位補0。
「>>」:移動時,對於有符號數,其符號位將隨同移動。當為整數時,最高位補0;而為負數時,符號位為 1,最高位是補 0 或是補 1 取決於編譯系統的規定。
在這個運算子的學習過程中,我結合了前面的大端、小端模式。這是計算機儲存資料的模式。通過測試後,本人的計算機為小端模式。並結合小端模式和左移、右移運算子的知識。發覺資料儲存模式並不會影響左移、右移運算子的操作。這就衍生了乙個新的問題,大端、小端模式對什麼有影響?在什麼情況下有影響?
下面來看看乙個例子:
0x01
<<2+3
不要驚訝,結果是32,因為優先順序的問題,+ 比 << 優先順序要高
那這兩個呢?
0x01
<<2+30;0x01
<<2
-3;
編譯執行,是不行的,因為
左移和右移的位數是不能超出資料的長度也不能小於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 一樣,你不去實踐,按照理論去想的話。肯定能編譯通過的,但是你實踐了,才知道是錯誤的。
C 關係運算子與邏輯運算子
1.關係運算子 比較運算 關係運算子用於比較兩個值並決定它們的關係,然後給出相應的取值。關係表示式 由關係運算子連線起來的式子。關係表示式的運算結果為 bool 型別,bool 型別只有兩個值 true和false。如果關係運算表示式成立,則這個表示式的值為 true 否則為 false。using...
php位運算子與邏輯運算 php 邏輯運算子 和
在php中,邏輯運算子無非是將值進行邏輯運算。還有其它用法嗎?先看看以下的 吧。提前給出結論就是 or 這兩種運算子在程式中可以加快php 的執行速度。test 李四 test 張三 test 張三來了 echo test 輸出 李四 test 李四 test 張三 test 張三不在這裡 echo...
邏輯運算子與位運算子
1.運算子 用於對邏輯值的取反運算。當邏輯值為true時,經過取反變為false 當邏輯值為false時取反成true。2.運算子 運算子 用於對邏輯值進行異或運算。當運算兩側同時為true或false時,運算結果為false,否則為true。3.運算子 和 運算子 和 均用於邏輯與運算。當兩側同時...