Chinaunix首页 | 论坛 | 博客
  • 博客访问: 142578
  • 博文数量: 25
  • 博客积分: 100
  • 博客等级: 中士
  • 技术积分: 310
  • 用 户 组: 普通用户
  • 注册时间: 2011-05-03 18:56
文章分类

全部博文(25)

文章存档

2012年(4)

2011年(21)

分类: C/C++

2011-06-20 22:36:02

C语言运算符的优先级有一张表格,比较难以记忆,我在这分类整理一下,希望能够方便记忆一些。
1.首先记忆两个极端,最高和最低最高优先级是[] () . 和 -> 四个符号,也就是说这些符号优先和前面的变量结合,即可以用一个括号把他们和前面的变量括起来,这样就比较清楚了。例如int *p[10] 等价于int *(p[10]) 即p是一个10个元素的数组,元素类型为int指针。对应的int (*p)[10] 的意思就是p是一个指向int型数组的指针;至于极低优先级,就是,逗号了,逗号的用法也很另类,就是依次计算表达式,(reg1,reg2,reg3)这个表达式的值是reg3的值。一个容易犯的错误是int a[2][2]={(1,2),(3,4)};预期这个数组的值是{1,2,3,4},而实际值是{1,2,0,0},同时,正确的写法是{{1,2},{3,4}}.

2.然后其余运算符的优先级是这样的:单目运算符-双目运算符-三目运算符-赋值运算符,下面挨个来说:
(1)单目运算符有++,--,sizeof(),取值*,取址&,求反!,按位求反~等等;
(2)双目运算又细分运算优先级:算术运算符(乘除>加减>移位)-关系运算符(如== != 几种关系之间的优先级就不记了,靠实际经验吧)-逻辑运算符(按位的>不按位的)
(3)三目运算符只有一种 ?: 
(4)最后是赋值运算符,包括= 以及复合了其他运算符的=号,如+=, &= 等等。

3.此外,很重要的一点,不得不提,就是表达式的计算顺序。只要记住:单目运算符、三目运算符是从右往左算的,也就是说表达式的值等于表达式最左边的部分;赋值运算也是从右往左(这个不言而喻)。除此以外的所有运算符都是自左向右运算的,也就是表达式值等于右边的部分。
举两个简单的例子:i++的值等于i没有自增之前的;int i=0,j=0; i && ++j;这个表达式的值是0,j=0.因为从左向右发现i=0后,断定表达式为0,所以++j就没有再算。从汇编的角度可以想象,与逻辑中第一个比较语句失败之后,会直接跳过后面一个比较语句:
  1. and R0,#1
  2. jnp FALSE
  3. ldr R0,#Addr
  4. inc R0
  5. str #Addr,R0
  6. and R0,#1
  7. jnp FALSE
  8. TRUE:
  9. .....
  10. FALSE:
  11. .....

PS {}不是一种运算符,只是用来形成代码块。在函数、循环、数组等等场合分别有不同的用法,这个基本要靠记忆了。
阅读(1533) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~