有过编程经验的人一定会有这样的体会,其实我们现在用的ANSI C中规定的运算符优先级存在一些“错误”,这里所谓错误,其实就是指按常规方式使用时,可能引起误会或者错误的运算符。先列举如下:
一、.的优先级高于*
表达式:*p.f
人们可能误以为的结果:p所指对象的字段f,即(*p).f
实际的结果:对p取f偏移,然后进行解引用操作,相当于*(p.f)
说明:->操作符用于消除这个问题。
二、[]的优先级高于*
表达式:int *ap[];
人们可能误以为的结果:ap是一个指向int数组的指针,即int(*ap)[];
实际的结果:ap是一个元素为int指针的数组,相当于(int *) ap[];
三、函数()的优先级高于*
表达式:int *fun();
人们可能误以为的结果:fun是一个函数指针,所指函数返回值为int,即int(*fun)();
实际的结果:fun是一个函数,返回值为int *,相当于int *(fun());
四、==和!=的优先级高于位运算符
表达式:(val&mask!=0)
人们可能误以为的结果:(val&mask)!=0;
实际的结果:val&(mask!=0);
五、==和!=的优先级高于赋值运算符
表达式:c=getchar()!=EOF;
人们可能误以为的结果:(c=getchar())!=EOF;
实际的结果:c=(getchar()!=EOF);
六算术运算符的优先级高于移位运算符
表达式:msb<
人们可能误以为的结果:(sb<
实际的结果:msb<<(lsb+4);
阅读(976) | 评论(0) | 转发(0) |