Chinaunix首页 | 论坛 | 博客
  • 博客访问: 61798
  • 博文数量: 18
  • 博客积分: 1400
  • 博客等级: 上尉
  • 技术积分: 211
  • 用 户 组: 普通用户
  • 注册时间: 2009-10-21 18:11
文章分类

全部博文(18)

文章存档

2010年(8)

2009年(10)

我的朋友

分类: C/C++

2009-11-17 16:32:54

   有过编程经验的人一定会有这样的体会,其实我们现在用的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);
 
阅读(936) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~