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