之前在使用三目运算符时候遇到了一个优先级问题,索性今天拿出来跟大家分享一下,我们知道C语言中的运算符是有优先级的,但是这么多有时候大家会记不住,就会出现一些优先级循序造成的错误,比如今天我分享的这个例子。
大家可以先看以下这段代码:
#include <stdio.h>
typedef unsigned char u8;
typedef unsigned short u16;
typedef unsigned int u32;
int main()
{
u8 a = 0, b = 0;
u8 a1 = 0, b1 = 0;
u8 c = 0x01;
a = c&0x01==0x01? 1:0;
b = c&0x02==0x02? 1:0; //其结果输出为1,因为==的优先级大于&,所以0x02==0x02会先比较
printf("a的值为:%d\n",a);
printf("b的值为:%d\n",b);
a1 = (c&0x01)==0x01? 1:0;
b1 = (c&0x02)==0x02? 1:0; //加了括号因此,c&0x02会先比较,然后再与==0x02进行比较
printf("a1的值为:%d\n",a1);
printf("b1的值为:%d\n",b1);
return 0;
}
其运算结果为:
可以看出a/b和a1/b1的运算式仅仅只是差了一个“()”结果就不一样,这里我们分析一下原因,
首先,第一条a与a1的运算
a = c&0x01==0x01? 1:0;
a1 = (c&0x01)==0x01? 1:0;
因为“”的优先级大于“&”,而三目条件运算符“?:”的优先级比这两个都低,因此"0x010x01"会先进
行比较,比较结果为1,再与变量c进行与运算&,因为变量c的值为0x01,因此结果为1,所以a = 1。
而a1比a的运算式多了一个“()”括号,因为括号的优先级最大,所以变量c会与0x01进行比较,其c&0x01等于1,而1==0x01,所以a1也等于1。
第二条b和b1的运算
b = c&0x02==0x02? 1:0; //其结果输出为1,因为==的优先级大于&,所以0x02==0x02会先比较
b1 = (c&0x02)==0x02? 1:0; //加了括号因此,c&0x02会先比较,然后再与==0x02进行比较
上面已经说明了其优先级,因此0x02==0x02会先进行,其结果为1,然后再与变量进行与运算&,因为变量c等于0x01,所以结果还是为1,所以b = 1;
而b1的运算式也多加了一个"()",所以变量c先与0x02进行与运算,其结果等于1,然后再进行1==0x02运算,其结果为0,因为1不等于0x02,所以0?1:0=>其结果为0。
从上面两条举例来看,可以看出因为"==“的优先级结果大于”&"造成其结果不一样,所以我们在平时的程序编写中也要格外注意运算符的优先级,如果不确定运算符的优先级,大家可以加上相应的括号来保证其正确的运算顺序。
如果大家还不理解的话,可以把我上面的代码复制过去运算一下,或许就会发现其不同。
本人水平有限,上述信息仅供参考,如有错误和不妥之处,请多多指教。
另外创作不易,请勿抄袭,如果有帮助到大家的话希望大家可以点个赞,谢谢~