1. 优先级运算符的使用
我相信玩过C的人都曾有过这样的或那样的不可思议经历,会非常感慨C的博大精深、深不可测,很多时候你根本不知道一条语句的真实执行情况(除非经过具体环境的编译和执行得出结论,可能你事后还是很迷茫),其实,有些已成事实特性并不是原本设计C语言时想要看到的,因为有些运算符的优先级是错误的,如果你不相信,下面就来看一下这样例子:
i = 1, 2;
你觉得i的结果会是多少?我们知道逗号的运算符的值就是最右边操作数的值。但在这里赋值符的优先级更高,所以实际情况应该是:
(i = 1), 2; /* i的值为1 */
i负值为1,然后执行常量2的运算,计算结果丢弃。最终i的结果是1而不是2。
2.常见的最容易犯错的优先级运算符
1)"."的优先级高于"*"
举例:*p.f
可能误以为的结果:p所指对象的字段f,(*p).f
实际结果:对p取f偏移,作为指针,然后进行解除引用的操作 *(p.f)
2) "[]"的优先级高于"*"
举例:int *ap[]
可能误以为的结果:ap是一个指向int数组的指针 int(*ap)[]
实际结果:ap是一个元素为int指针的数组 int *(ap[])
3) 函数"()"的优先级高于"*"
举例:int *fp()
可能误以为的结果:fp是一个函数指针,所指函数返回int,