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就没有再算。从汇编的角度可以想象,与逻辑中第一个比较语句失败之后,会直接跳过后面一个比较语句:
- and R0,#1
-
jnp FALSE
-
ldr R0,#Addr
-
inc R0
-
str #Addr,R0
-
and R0,#1
-
jnp FALSE
-
TRUE:
-
.....
-
FALSE:
-
.....
PS {}不是一种运算符,只是用来形成代码块。在函数、循环、数组等等场合分别有不同的用法,这个基本要靠记忆了。
阅读(1527) | 评论(0) | 转发(0) |