找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

巢课
电巢直播8月计划
查看: 119|回复: 1
打印 上一主题 下一主题

C语言编程容易混淆的几个问题总结

[复制链接]

114

主题

136

帖子

1000

积分

四级会员(40)

Rank: 4Rank: 4Rank: 4Rank: 4

积分
1000
跳转到指定楼层
1#
发表于 2017-8-23 17:24 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您!

您需要 登录 才可以下载或查看,没有帐号?注册

x
在进行单片机开发时,经常都会出现一些很不起眼的问题,这些问题其实都是很基础的c语言知识点,是一些小细节。但是正是因为很基础,又都是小细节,所以我们往往容易忽视它们。结果有时候我们会花很长的时间纠结一个问题,迟迟找不到问题的所在。当发现原因竟然是这么的简单和不起眼时,我想大家都会感到痛不欲生。笔者今天又碰到了这样的问题,实在忍不住了。因为这些问题都是小的知识点,考虑到之前也遇到好多这种问题,于是决定每次遇到问题就记录下来,时刻提醒自己!!
1. !和~不一样
§ ! :逻辑非符号;
§ ~:是位取反符号;
IO口某个管脚赋值时不要错用 !,如
file:///C:\Users\郭晓娟\AppData\Local\Temp\ksohtml\wps88FF.tmp.jpg
1. <<和>>的优先级低于+、-
比如要实现c=x*2+1,没有加括号会出错
        file:///C:\Users\郭晓娟\AppData\Local\Temp\ksohtml\wps890F.tmp.png
3. 移位要防止溢出
其实用移位代替乘除法是个不错的方法,笔者很喜欢拿到一段代码后用移位代替乘除法来进行优化。不过有时候却会出现问题,比如溢出问题。当很明显可能溢出的话我们是会注意的,比如
file:///C:\Users\郭晓娟\AppData\Local\Temp\ksohtml\wps8910.tmp.png
但是有时候这个问题是不明显的,比如当移位出现在数组索引或函数参数时,有段用液晶显示字符的代码如下
file:///C:\Users\郭晓娟\AppData\Local\Temp\ksohtml\wps8921.tmp.png
我们可以用左移运算来代替乘法进行优化,如
file:///C:\Users\郭晓娟\AppData\Local\Temp\ksohtml\wps8922.tmp.png
这本是一个好方法,但是事实上上面的代码是错的。当执行c<<4时,因为没有明显的赋值过程,我们可能认为没问题,而事实上c的高位已经丢失了,所以得到错误的结果。一个可行的做法是先进行强制转换,如
file:///C:\Users\郭晓娟\AppData\Local\Temp\ksohtml\wps8923.tmp.png
4. 无符号和有符号运算
当一个有符号数和一个无符号数进行算术运算时,系统会自动将有符号数强制转换为无符号数再进行运算(即使你使用有符号数强制类型转换),如下面两种写法的运输结果是一样的信盈达嵌入式企鹅要妖气呜呜吧久零就要
file:///C:\Users\郭晓娟\AppData\Local\Temp\ksohtml\wps8924.tmp.png
file:///C:\Users\郭晓娟\AppData\Local\Temp\ksohtml\wps8935.tmp.png
5. 局部变量要初始化
这一点是比较容易被忽略的。局部变量没有初始化的话,因为单片机每次为他分配的是同一个内存区域,当你在函数中是这么使用局部变量时,就可能出问题:
file:///C:\Users\郭晓娟\AppData\Local\Temp\ksohtml\wps8936.tmp.png
如果第一次调用fun时,a传递的值为0,那么flag = 0x01;
执行if(flag&0x01)后面的代码。以后再调用fun时,即使a不为0,但flag依然使用之前的内存区域,所以其值一直为0x01,一直执行的是if后面的代码,而不是else后面的

+ r$ g- w5 }  ^# T6 z  h8 K; I4 o6 W

评分

参与人数 1威望 +5 收起 理由
ArthurGXH + 5 赞一个!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
收藏收藏 支持!支持! 反对!反对!

0

主题

82

帖子

93

积分

二级会员(20)

Rank: 2Rank: 2

积分
93
2#
发表于 2017-11-25 20:05 | 只看该作者
要相信自己~智商为0
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

巢课

技术风云榜

关于我们|手机版|EDA365 ( 粤ICP备18020198号 )

GMT+8, 2024-10-18 17:19 , Processed in 0.057395 second(s), 33 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表