C 和指標第 5 章 操作符和表示式 筆記

2021-09-17 18:51:15 字數 3147 閱讀 9752

這章標題為操作符和表示式,主要講述了操作符、布林值、左值和右值、表示式求值,下面分別簡要介紹下

算術操作符

+-*/%

這裡說下/%,前者求商,後者用來求模也就是求餘數,例如

#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 如果左右兩邊是數字,那麼它們的值相等就...