這章標題為操作符和表示式,主要講述了操作符、布林值、左值和右值、表示式求值,下面分別簡要介紹下
算術操作符
+
、-
、*
、/
、%
這裡說下/
和%
,前者求商,後者用來求模也就是求餘數,例如
#include
intmain
(void
)
移位運算子
<<
、>>
也叫左移和右移,簡單點說左移幾位就是乘以2
的幾次方,比如1
左移1
位,那麼二進位制表示為0000 0010
,轉成十進位制就是1*2^1 + 0*2^0=2
,套用剛剛的方法1 * 2^1 = 2
;右移幾位就是除以2
的幾次方,2
向右移1
位,二進位制表示為0000 0001
,十進位制位1*2^0=1
,套用方法2/2^1=1
。
#include
intmain
(void
)
書中給了個數1
的例子,核心就是每次判斷最低位是否為1
#include
intcount_one_bits
(unsigned value)
;int
main
(void
)int
count_one_bits
(unsigned value)
}return count;
}
位運算子
看下面這幅圖就夠了
這裡就可以用位運算子來優化上面數1
的演算法了
int
count_one_bits
(unsigned value)
}return count;
}
賦值
通過賦值表示式對變數就行賦值,太簡單了,就不展開了。
單目運算子
關係運算子
>
、>=
、<
、<=
、!=
、==
看看就能明白。
邏輯運算子
&&
、||
,這裡需要說的是||
的短路求值
特性,也就是它首先對左運算元進行求值,如果為真,那麼右運算元便不再求值。
條件運算子
也叫三目運算子,exp1 ? exp2 : exp3
,如果exp1
為真,那麼表示式的值就是exp2
,否則就是exp3
。
逗號操作符
exp1, exp2, exp3
,這個表示式自左向右逐個求值,整個逗號表示式的值就是最後那個表示式的值。
if
(b +
1, c /
2, d >
0)
如果d > 0
那麼整個表示式的值就為真,這種用法比較少見,能不用就不用吧。
下標引用、函式呼叫和結構成員c
不具備顯式的布林型別,所以使用整數來代替:零時假,任何非零值皆為真,因此**中可以使用巨集來代替
#define true 1
#define false 0
左值l-value
【意味著乙個確定/特定的位置】
右值r-value
【意味著乙個值】
在使用右值的地方可以使用左值,但是在需要左值的地方卻不能使用右值
a = b + 25;
a 是個左值,因為它標識了乙個可以儲存結果值的地點
b + 25 是個右值,因為它指定了乙個值
b + 25 = a;
原先用作左值的 a 此時可以當做右值,因為每個位置都包含乙個值。
而 b + 25 不能作為左值,因為它並未標識 【乙個特定的位置】。因此,這條賦值語句是非法的。
注意當計算機計算 b + 25時,它的結果必然儲存於機器的某個地方。但是,程式設計師並沒有辦法
**該結果會儲存在什麼地方,也無法保證這個表示式的值下次還會儲存於那個地方。其結果是,
這個表示式不是乙個左值。基於同樣的理由,字面值常量也都不是左值。
聽上去似乎是變數可以作為左值而表示式不能作為左值,但這個推斷並不準確。在下面的賦值
語句中,左值便是乙個表示式。
int a, *pi;
pi = &a;
*pi = 20;
第二條賦值語句,是個表示式語句,但卻是合法的的左值。
因為 pi 的值是記憶體中某個特定位置的位址,* 操作符使機器指向那個位置
當它作為左值使用時,這個表示式指定需要進行修改的位置
當它作為右值使用時,它就是提取當前儲存於這個位置的值
隱式型別轉換
主要見於字元的型別一般用int
,而不能用char
,防止型別截短造成判斷失誤
算數轉換
主要是整型到浮點型的轉換,看下圖
操作符的屬性
優先順序和求值順序
這個和上面那個緊密相關,個人理解,對於複雜的表示式,還是多加括號聚組的好,不用勞心費力的辨別優先順序了。
第5章 操作符和表示式
移位操作只是簡單地把乙個值的位向左或向右移動。在左移位中,值最左邊的幾位被丟棄,右邊多出來的幾個空位則由0補齊。右移位操作存在乙個左移位操作不曾面臨的問題 從左邊移入新位時,可以選擇兩種方案。一種是邏輯移位,左邊移入的位用0填充 另一種是算術移位,左邊移入的位由原先該值的符號位決定,符號位為1則移入...
C和指標 操作符和表示式
與操作 如果兩個位都是1,結果為1,否則為0 或操作 如果兩個位都是0,結果為0,否則為1 異或 如果兩個位不同,結果為1,如果兩個位相同,結果為0 邏輯操作符 和 用於對表示式求值,測試它們的值是真還是假。邏輯操作符具有短路性質,如果表示式的值根據左運算元便可決定,它就不再對右運算元進行求值,而位...
5 表示式和操作符
下面的準則要牢記 有的時候覺得這個規則蠻麻煩的 1 如果左右兩邊是同乙個物件的reference,那麼返回true。這種情況都是false var now new date var arr1 now var arr2 now arr1 arr2 false 2 如果左右兩邊是數字,那麼它們的值相等就...