Fork me on GitHub

随笔 - 997  文章 - 5  评论 - 181  阅读 - 300万 
壹:
   对于优先级:算术运算符 > 关系运算符 > 逻辑运算符 > 赋值运算符。逻辑运算符中“逻辑非 !”除外。这是程序员总结出来的最快的学习方式。
可在实战中,还是经常遇到一些让人困惑的问题。下面看一个实例。
 
贰:
   代码很简单,直接上源码:
复制代码
#include <stdio.h>
typedef unsigned char uint8_t;
typedef unsigned int uint32_t;
uint8_t buf3[] = {0x12,0x34,0x56,0x78};
int main()
{

        // unexpected result
        uint32_t tick_num1 = buf3[0]<<8 + buf3[1];
        printf("tick_num1 is:0x%x \n\r",tick_num1);

        uint32_t tick_num2 = (buf3[0]<<8) + buf3[1];
        printf("tick_num2 is:0x%x \n\r",tick_num2);

        // unexpected result
        uint32_t tick_num3 = buf3[0] + buf3[1]<<8 + buf3[2]<<16 + buf3[3]<<24;
        printf("tick_num3 is:0x%x \n\r",tick_num3);

        // expected result
        uint32_t tick_num4 = buf3[3] + (buf3[2]<<8) + (buf3[1]<<16) + (buf3[0]<<24);
        printf("tick_num4 is:0x%x \n\r",tick_num4);

        return 0;
}
复制代码
假如不看运算结果,估计没几个人能把这个结果算出来,不信的话你可以试试。对的话直接来我们公司面试即可。
叁:
 下面是运算结果,是不是有些出乎你的预料呢?
➜  char_vs_int git:(master) ✗ ./test 
tick_num1 is:0x20000000 
tick_num2 is:0x1234 
tick_num3 is:0x0 
tick_num4 is:0x12345678 

建议吃不准的同学还是尽量加括号,这样才不至于犯大错。

posted on   虚生  阅读(121)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
历史上的今天:
2020-02-28 C语言中的弱符号(weak)用法及实例
2018-02-28 U-boot的编译方式及目录结构解析
2018-02-28 C语言中volatile的作用和使用方法
点击右上角即可分享
微信分享提示