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

在进行单片机开发时,常常都会出现一些很不起眼的问题,这些问题其实都是很基础的c语言知识点,是一些小细节。可是正是由于很基础,又都是小细节,因此咱们每每容易忽视它们。结果有时候咱们会花很长的时间纠结一个问题,迟迟找不到问题的所在。当发现缘由居然是这么的简单和不起眼时,我想你们都会感到痛不欲生。笔者今天又碰到了这样的问题,实在忍不住了。由于这些问题都是小的知识点,考虑到以前也遇到好多这种问题,因而决定每次遇到问题就记录下来,时刻提醒本身!!数组

1. !和~不同函数

§ ! :逻辑非符号;优化

§ ~:是位取反符号;索引

对IO口某个管脚赋值时不要错用 !,如内存

1. <<和>>的优先级低于+、-开发

好比要实现c=x*2+1,没有加括号会出错基础

3. 移位要防止溢出变量

其实用移位代替乘除法是个不错的方法,笔者很喜欢拿到一段代码后用移位代替乘除法来进行优化。不过有时候却会出现问题,好比溢出问题。当很明显可能溢出的话咱们是会注意的,好比方法

 

可是有时候这个问题是不明显的,好比当移位出如今数组索引或函数参数时,有段用液晶显示字符的代码以下im

 

咱们能够用左移运算来代替乘法进行优化,如

 

这本是一个好方法,可是事实上上面的代码是错的。当执行c<<4时,由于没有明显的赋值过程,咱们可能认为没问题,而事实上c的高位已经丢失了,因此获得错误的结果。一个可行的作法是先进行强制转换,如

 

4. 无符号和有符号运算

当一个有符号数和一个无符号数进行算术运算时,系统会自动将有符号数强制转换为无符号数再进行运算(即便你使用有符号数强制类型转换),以下面两种写法的运输结果是同样的信盈达嵌入式企鹅要妖气呜呜吧久零就要。 

 

 

5. 局部变量要初始化

这一点是比较容易被忽略的。局部变量没有初始化的话,由于单片机每次为他分配的是同一个内存区域,当你在函数中是这么使用局部变量时,就可能出问题:

 

若是第一次调用fun时,a传递的值为0,那么flag = 0x01;

执行if(flag&0x01)后面的代码。之后再调用fun时,即便a不为0,但flag依然使用以前的内存区域,因此其值一直为0x01,一直执行的是if后面的代码,而不是else后面的

相关文章
相关标签/搜索