目录
一、错误案列
1.flag的二进制表达式中只有一个1,现在判断flags二进制形式在flag为1的那一位上是否也为1:
if(flag & flags !=0);
2.将getc函数的返回值赋给c并判断是否为EOF:
while(c=getc(in)!=EOF);
3.类似2的问题再复杂些:
if(t=BTYPE(pt1->aty)==start || t==UNION);
以上都是有优先级问题的代码,你都能发现他们的问题吗,如果不能,来看看下面对优先级的解读和记忆。
二、优先级规律
1.优先级表
[结合性指的是编译器解释的顺序。例如:a,b,c自左向右解释为(a,b)c 而不是a,(b,c) ]
2.优先级总结
(注:颜色相同表示有相似性,便于记忆)
①()[ ] -> . 这类非运算符优先级为1 。
②单目操作符优先级为2,类型转化也是单目操作符哦。 (自右至左)
③双目操作符优先级为3,其中
1.算数操作符(% / *) > (+ -)
2.移位操作符(>> <<)
3.关系操作符(> ,< , >= ,<= )> (== !=)
4.位操作符(& > ^ > |)
5.逻辑操作符(&& > ||)
6.赋值操作符(= += -= &= ……) (自右至左)
④三目操作符优先级为4,(?:) (自右至左) [例如:(a?b,(c?,d,e ) )]
⑤,优先级为5
三、小试牛刀
试问下列式子打印的结果分别是多少
#include<stdio.h>
int main()
{
int a = 3, b = 5;
int n = 2;
int m;
(m = a <= 3) && a + b < 8;
printf("%d\n", n += n -= n * n);
printf("%d\n", n += n -= n *= n);
printf("%d",m );
return 0;
}
-4 0 1
分析:注意好优先级和结合性对这种问题就能轻松处理了。同时别忘了+=这一类的赋值操作符会改变变量的大小。
小提醒:1.在涉及赋值操作符时和容易发生错误,要考虑有无必要加上()
2.赋值操作符的优先级都是一样的