2.復合運算符
(1)i+=1和i=i+1的區別:前者是i的值只計算一次,而後者i的值會計算兩次。
例:a[foo()]+=1和a[foo()]=a[foo()]+1,如果foo()函數打印一條消息,那麼前者只會打印一次,而後者會打印兩次消息。
(2)逗號運算符:先求左邊的值,求完值後把值丟掉,右邊作為整個表達式的值
函數的實參也是使用逗號分開參數,但是也可以寫成: f (a,(t=2,t+3),c) ,第二個參數裡面使用了逗號運算符。
(3)sizeof 和typedef
sizeof: 返回類型是size_t(無符號整型),注意size_t在不同的平台是不同的類型,有些平台是unsigned long long類型
用法:
1.sizeof 表達式
2.sizeof(類型)
typedef:類型定義或者通俗的說給類型起別名
例:typedef unsigned long size_t,那麼size_t就是unsigned long類型
3.Side Effect和Sequence Point
a=(++a)+(++a)+(++a)+(++a) 最後a的值是undefined
Sequence :調用一個了函數可能產品Side Effect,或者++=,—= 這樣的復合運算符也可能產生Side Effect.
Side Effect的計算順序無法確定。
在庫函數返回時是Sequence Point.
邏輯與(&&)和邏輯或(||):求值順序:先求左值,右值可能不會計算或者說求值。
1.在兩個Sequence Poine之間的多個Side Effect的順序不確定,那麼在之間的變量允許被改變一次。
2.同時在兩個Sequence Point之間既要讀一個變量的值又要改它的值,只有在讀寫順序確定的情況下才可以這麼寫,比如a[i++]=i和i=i+1,前者的順序無法確定,後者的計算順序是確定的。
例: a=(++a)+(++a)+(++a)+(++a) 最後a的值是undefined