1、 要看懂今天的代码需要一点储备知识。

2、 题目及分析 话不多说上代码:

你算出的结果是什么? 估计大部分的朋友算出的结果都是 2 。

初步分析 让我们一起来看一下,大致分析这个代码,可以发现这个代码考察了两个知识点: 一是数据类型转换问题 二是运算符的优先级问题 上面这行代码,~的优先级最高,首先肯定是对a进行按位取反,然后是+的优先级较高,所以执行4+1 =5,最后执行右移操作。 程序员必读书有哪些?这个其实没办法回答,你最需要的,就是你必读的。不过,仍然有很多经典的书籍,当你读完这些之后,你会发现另外一番天地,也解放了自己的思维方式。 代码大全(第二版)

image 本书从软件质量、编程思想等方面阐述了软件构建的各种问题,并论述了紧跟潮流的新技术、高屋建瓴的观点,而且还有丰富的程序示例。看完这本书,可以打开自己的思维方式,有种柳暗花明又一村的感觉。 程序员修炼之道

image 这本书主要讲述了使代码保持灵活并且易于改变和复用的各种框架技术,利用了许多富有娱乐型的奇闻异事,具有思想性的例子及有趣的类比,全面阐述了软件开发的许多不同方面的最佳实践和重大陷阱,绝对是程序员必读的书之一。 计算机程序的构造和解释

image 本书成型于麻省理工学院多年使用的一本教材,世界各地已有100多所院校采用本书作为教材,包括美国福斯坦大学、普林斯顿大学、牛津大学、东京大学等。 这本书,能赋予你智慧。 C程序设计语言

image 由C语言设计者Dennis M.Ritchie和著名计算机科学家Brian W.Kernighan编写的一部介绍C语言标准及其程序设计方法的权威性经典著作。全面、系统的讲诉了C语言各个特性及程序设计的基本方法。 C语言开发者必读的一本书,其他开发者也不妨看看,非常有价值。 重构:改善既有代码的设计

image 实用性书籍,清晰揭示了重构的过程,解释了重构的原理和最佳实践方式,并给出了何时、何地应该开始挖掘代码以求改善。书中给出了70多个可行的重构,每个重构都介绍了一种经过验证的代码变换首发的动机和技术。 这本书可以帮助你减少开发过程中的风险,是很有价值的参考读物。 人月神话

image 本书蕴藏了很多发人深省的观点,而且有大量的软件工程的实践,为每个复杂项目的管理着给出了自己的真知灼见。这本书适合软件开发行业的从业人员阅读,对软件开发、软件项目经理、系统分析师更是必读之作。 代码简洁之道

image 《代码整洁之道》提出一种观念:代码质量与其整洁度成正比。干净的代码,既在质量上较为可靠,也为后期维护、升级奠定了良好基础。作为编程领域的佼佼者,这些实践在《代码整洁之道》中体现为一条条规则(或称“启示”),并辅以来自现实项目的正、反两面的范例。只要遵循这些规则,就能编写出干净的代码,从而有效提升代码质量。 这本书非常有借鉴的价值。 另外“想要成为一个优秀的、有能力程序员,做软件开发的话,就来学习C/C++吧!你如果感觉自学C/C++语言有困难的话。我自己也是一名从事了多年开发的C/C++程序员,组建了一个零基础编程交流裙!不管你是大牛还是小白,大家都一起成长进步。这里是小白聚集地,欢迎初学和进阶中的小伙伴。 企鹅群:985636405(持续招募中)

image

image 因此上面的代码等价于: 也就是先对a进行逐位取反,~0xa5 = ~ (1010 0101b) = 0101 1010b = 0x5a 再右移5位得到0x2。结果算出来是2? 让我们直接运行代码来查看结果:

怎么回事?答案并不是预期中的2,b忽然等于250!,这是为什么呢?

隐式数据类型转换和整值提升 让我们再来仔细观察上面这行代码,发现出现了不同类型之间的运算:a的数据类型是char,4和1的数据类型没有指定,c语言编译器会默认其为int类型。 相信大家都知道,在C语言的运算过程中,如果运算符两边的数据类型不一致,编译器会自动进行隐式数据类型转换。 这种数据类型转换总体来说比较复杂,但是总体遵循这个原则:尽量避免数据精度损失 上面的原则意味着什么呢? 如果运算符两边的数据类型不一致,编译器总是尽量往较宽的数据类型进行转换。 如果计算过程中的计算数不是浮点数,那么他们肯定都是整型,编译器一般会将所有小于int类型宽度的数据类型提升到int,这种现象被称为“整值提升” 进一步分析

知道了整值提升,让我们再来重新看看上面这行代码: a是unsigned char,数据宽度小于 int,所以编译器在对a进行按位取反操作之前,会先将a的数据类型提升至int。 不同机器上,int的数据宽度不同,在我的机器上int的大小是4个字节。 因此将a进行数据类型转换后,a = 0x 00 00 00 a5 ,按位取反以后就是 ~a = 0x ff ff ff 5a,然后再按位右移5位(高位自动补0),得到的就是0x07 ff ff fa ,在将该数值复给b的时候,因为b的数据类型是 char,只有一个字节,因此会发生数据截断,只有最低位字节保留下来了,也就是 0xfa = 250。 总结 通过这道题,大家可以发现,如果对c语言的隐式数据类型转换不熟悉,就很容易上套。 另外,运算符的优先级还是比较难记的,建议还是使用括号明确执行顺序。
网友评论