操作符优先级

2016-10-27  本文已影响30人  xiaoyanhan

1、标识符、常量、字符串和用()括号套起来的表达式是组成表达式的最基本单元,在运算中做
操作数,优先级最高。
2、后缀运算符,包括数组取下标[]、函数调用()、结构体取成员.、指向结构体的指针取成员->、后缀自增++、后缀自减--。如果一个操作数后面有多个后缀,按照离操作数从近到远的顺序
(也就是从左到右)依次运算,比如 a.name++ ,先算 a.name ,再++,这里的 .name 应该看成 a 的
一个后缀,而不是把 . 看成双目运算符。
3、单目运算符,包括前缀自增++、前缀自减--、 sizeof 、类型转换()、取地址运算&、指针间接寻址、正号+、负号-、按位取反~、逻辑非! 。如果一个操作数前面有多个前缀,按照离操作数从近到远的顺序(也就是从右到左)依次运算,比如 !~a ,先算 ~a ,再求!。
4、乘
、除/、模%运算符。这三个运算符是左结合的。
5、加+、减-运算符。左结合。
6、移位运算符<<和>>。左结合。
7、关系运算符< > <= >=。左结合。
8、相等性运算符==和!=。左结合。
9、按位与&。左结合。
10、按位异或^。左结合。
11、按位或|。左结合。
12、逻辑与&&。左结合。
13、逻辑或||。左结合。
14、条件运算符:?。在第 2 节 “if/else语句”讲过Dangling-else问题,条件运算符也有类似的问
题。例如 a ? b : c ? d : e 是看成 (a ? b : c) ? d : e 还是 a ? b : (c ? d : e) ?C语言规
定是后者。
15、赋值=和各种复合赋值( *= /= %= += -= <<= >>= &= ^= |= )。右结合。
16、逗号运算符,左结合。

以下代码查找和打印0~1024之间所有256的倍数,对吗?
int i = 0;
for (; i <= 1024; ++i)
{
if (i & 0xff == 0)
{
printf("%d\n",i);
}
}

不对,因为=优先级比&高。,所以应改成if ((i & 0xff )== 0)
tip:在标准C语言的文档里,对操作符的结合性并没有做出非常清楚的解释。一个满分的回答是:它是仲裁者,在几个操作符具有相同的优先级时决定先执行哪一个。

int a,b=1,c=2;
a=b=c;

所有的赋值符(包括复合赋值)都具有右结合性,就是在表达式中最右边的操作最先执行,然后从右到左依次执行。这样,c先赋值给b,然后b在赋值给a,最终a的值是2。类似地,具有左结合性的操作符(如位操作符“&”和“|”)则是从左至右依次执行结合性只用于表达式中出现两个以上相同优先级的操作符的情况,用于消除歧义C语言中具有右结合性的运算符包括所有单目运算符以及赋值运算符(=)和条件运算符。其它都是左结合性判断表达式计算顺序时,先按优先级高的先计算,优先级低的后计算,当优先级相同时再按结合性,或从左至右顺序计算,或从右至左顺序计算。

上一篇下一篇

猜你喜欢

热点阅读