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

posted on 2013-09-24 23:37  ybq155  阅读(326)  评论(2编辑  收藏  举报