文章分类 -  C语言

3. 减少表达式对C语言运算符优先级的依赖性
摘要:在更多情况下,应该用括号() 来保证运算顺序,而不依赖于C语言默认的运算符优先级。分析下面程序:if( reg & BUSY_MASK == 0) { do something;}该程序的本意是读状态寄存器的值,判断BUSY位是否为0.但是,由于判断运算符“==”的优先级高于位操作符“&”,实际的判断表达式变成了“( reg & (BUSY_MASK == 0) !=0)”,所以应该加入括号以保证判断表达式的正确性。在程序中,容易出现混淆的地方,也应该用括号来组织语句,如:if( a && b || c && d)应该改为:if( (a 阅读全文

posted @ 2011-02-25 17:59 startup 阅读(164) 评论(0) 推荐(0)

1. 指向不同数据类型的指针之间不能互相转化!!!!
摘要:uint8_t *p1;uint32_t *p2;p2=(uint32_t*)pp1;分析:程序员希望将从p1单元开始的4个字节组成一个32位的整型来参与运算。如果CPU允许各种数据对象存放在任意的存储单元,则以上转换没有问题。但某些CPU对某些数据类型加强了对齐限制,要求这些对象占用一定的地址空间,比如某些字节寻址的CPU会要求32位整型存放在4的整数倍地址上(就是所谓的address alignment地址对齐)。在这个前提下,假设p1最初指向的是0x0003单元,则执行最后一行强制转换后,p2到底指向哪个单元就无法预料了。 阅读全文

posted @ 2011-02-23 15:21 startup 阅读(579) 评论(0) 推荐(0)

导航