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


    之前在使用三目运算符时候遇到了一个优先级问题,索性今天拿出来跟大家分享一下,我们知道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;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    其运算结果为:运算结果
    可以看出a/b和a1/b1的运算式仅仅只是差了一个“()”结果就不一样,这里我们分析一下原因,

    首先,第一条a与a1的运算

    	a = c&0x01==0x01? 1:0;  
    	a1 = (c&0x01)==0x01? 1:0;
    
    • 1
    • 2

    因为“”的优先级大于“&”,而三目条件运算符“?:”的优先级比这两个都低,因此"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进行比较
    
    • 1
    • 2

    上面已经说明了其优先级,因此0x02==0x02会先进行,其结果为1,然后再与变量进行与运算&,因为变量c等于0x01,所以结果还是为1,所以b = 1;

    而b1的运算式也多加了一个"()",所以变量c先与0x02进行与运算,其结果等于1,然后再进行1==0x02运算,其结果为0,因为1不等于0x02,所以0?1:0=>其结果为0。

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

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

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

  • 相关阅读:
    第三章微服务配置中心
    react生命周期函数
    c++ linux 配置
    扎实的基础知识+正确的方法是快速阅读源码的关键
    外汇天眼:ThinkMarkets 获得 CySEC 许可证,允许其从塞浦路斯扩展其欧盟服务
    车道线检测(一)——PINet论文阅读
    c++11 智能指针 (std::shared_ptr)(四)
    如何快速实现一个可视化看板?
    Verilog实现SPI通信协议驱动设计
    [Windows环境]nvm工具的介绍和安装
  • 原文地址:https://blog.csdn.net/OMGMac/article/details/125630337