C经典书籍笔记——C陷阱与缺陷②(语法陷阱之优先级)

目录

一、错误案列

 二、优先级规律

1.优先级表 

2.优先级总结


一、错误案列

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.赋值操作符的优先级都是一样的

猜你喜欢

转载自blog.csdn.net/whc18858/article/details/120113251