爱板网论坛

查看: 194|回复: 3

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

[复制链接]

10

主题

0

好友

98

积分

童生

Rank: 2

  • TA的每日心情
    开心
    2017-9-10 14:49
  • 签到天数: 8 天

    连续签到: 1 天

    [LV.3]偶尔看看II

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

    回复

    使用道具 举报

    16

    主题

    0

    好友

    1804

    积分

    进士

    Rank: 5Rank: 5

  • TA的每日心情
    奋斗
    6 天前
  • 签到天数: 93 天

    连续签到: 1 天

    [LV.6]常住居民II

    发表于 2017-8-24 08:55:08 |显示全部楼层
    1. file:///C:\Users\郭晓娟\AppData\Local\Temp\ksohtml\wpsE1A0.tmp.jpg
    复制代码
    谜一样的配图
    回复

    使用道具 举报

    3

    主题

    1

    好友

    3930

    积分

    状元

    Rank: 6Rank: 6

  • TA的每日心情
    奋斗
    2017-11-6 22:21
  • 签到天数: 905 天

    连续签到: 1 天

    [LV.10]以坛为家III

    发表于 2017-8-24 11:15:38 |显示全部楼层
    写的好,学习和参考
    回复

    使用道具 举报

    9

    主题

    1

    好友

    496

    积分

    秀才

    Rank: 3Rank: 3

  • TA的每日心情
    开心
    昨天 09:09
  • 签到天数: 99 天

    连续签到: 1 天

    [LV.6]常住居民II

    发表于 2017-11-8 11:46:23 |显示全部楼层
    C语言确实很多细节需要注意
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    关闭

    站长推荐上一条 /2 下一条

    手机版|爱板网 |网站地图  

    GMT+8, 2017-11-21 13:53 , Processed in 0.279530 second(s), 11 queries , Memcache On.

    苏公网安备 32059002001056号

    Powered by Discuz!

    回顶部