分享一个使用三目优先级遇到的优先级问题

之前在使用三目运算符时候遇到了一个优先级问题,索性今天拿出来跟大家分享一下,我们知道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。

从上面两条举例来看,可以看出因为"==“的优先级结果大于”&"造成其结果不一样,所以我们在平时的程序编写中也要格外注意运算符的优先级,如果不确定运算符的优先级,大家可以加上相应的括号来保证其正确的运算顺序。

如果大家还不理解的话,可以把我上面的代码复制过去运算一下,或许就会发现其不同。

本人水平有限,上述信息仅供参考,如有错误和不妥之处,请多多指教。
另外创作不易,请勿抄袭,如果有帮助到大家的话希望大家可以点个赞,谢谢~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

OMGMac

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值