Chinaunix首页 | 论坛 | 博客
  • 博客访问: 249052
  • 博文数量: 12
  • 博客积分: 2500
  • 博客等级: 少校
  • 技术积分: 630
  • 用 户 组: 普通用户
  • 注册时间: 2006-03-13 16:17
文章分类
文章存档

2011年(1)

2008年(11)

我的朋友

分类: C/C++

2008-03-20 07:37:14

记录这篇blog,原因只有一个:C语言的发明者告诉你,有些运算符的优先级是错误的“。

看看下面这个表,我们有多少个理解正确了:

 

优先级问题 (规则)

表达式(例子)

误以为的结果(错误)

实际的结果(正确)

. 的优先级高于*

->操作符用于消除这个问题

*p.f

P所指向对象的字段f(*p).f

pf偏移,作为指针,然后进行解除引用操作。 *(p.f)

[]高于*

int *ap[]

ap是个指向int数组的指针。 int(*ap)[]

ap是个元素为int指针的数组。

int * (ap[])

函数()高于*

int *fp()

fp是个函数指针,所指函数返回int  int(*fp)()

fp是个函数,返回int *

int *(fp())

==!=高于位操作符

(val & mask = 0)

(val & mask) != 0

val & (mask != 0)

==!=高于赋值符

c=getchar() != EOF

(c=getchar())!=EOF

c = (getchar() != EOF)

算数运算符

高于移位运算符

msb << 4 + lsb

(msb << 4) + lsb

msb << (4 + lsb)

逗号运算符在所有运算符中优先级最低

i=1, 2

i = (1,2)

(i = 1), 2

 

所以有一个很好的专家级建议:

乘法和除法先于加法和加法;在涉及其他的操作符时一律加上括号。

 

阅读(1664) | 评论(0) | 转发(0) |
0

上一篇:没有了

下一篇:如何解析复杂的C语言声明

给主人留下些什么吧!~~