单片机编程规范
----主编:郑思鹏杨宗禄梁荣生夏立闯赵龙
C语言编程规范
参考资料:
林锐高质量C++/C 编程指南 2001-7-24
Andrew Koenig C Traps and Pitfalls (C陷阱与缺陷)
BYD-LPJ-A-10007软件编程规范 A0 2010-7-24
MISRA C 2004
i++案例
分析以下代码运行结果:
int i=3, y;
y = i*i++;
y = ?
A 9 B 12 C 16 D A或C E 不知道
类似的,i*++i; i++*i; ++i*i; i++*i++; i++*i++*i++; 结果是多少?
if ( ishigh && (x == i++)) 执行这条语句后i是否自动加1?
问题:
如何保证程序员的理解是正确的?
如何保证编译器的理解是正确的?
如何保证编译器的理解与程序员是一致的?
如何保证所有人的理解是一致的?
如何保证编译器不同版本、不同场合都是一致的?
switch案例
byte ExSw(byte chr)
{
byte ret;
switch (chr & 0xC0)
{
case 0x00:
{
ret = 0;
break;
}
case 0x40:
{
ret = 1;
break;
}
case 0x80:
{
ret = 2;
break;
}
case 0xC0:
{
ret = 3;
break;
}
}
return ret;
}
用CW HC08 ,结果是什么?,结果是什么?交替编译运行,结果是什么?
增加default语句,运行结果如何?
对ret进行初始化,运行结果如何?
将0xC0改为0xC0u,运行结果如何?
short案例
以下代码用Codewarrior HC08 ,功能正常;,功能与预期不符。
start = OSTime; /* start、end、OSTime数据类型为INT16U */
end = start + 1300u;
cnt = 3; /* 连续3次检测信号*/
for (; (((OSTime-end)&0x8000U)!=0) && (cnt != 0);
cnt--)
{
if (GetSnrSta() != HALL_ON)
{
cnt = 4;
}
}
经反复调试,发现数据类型INT16U对编译结果有影响。INT16U为2字节无符号数(unsigned short int),将类型定义中short去掉后,。
启示:
有变化即有差异,即有风险。开发工具如此,软件代码也是这样。哪怕是再小的变化,看起来绝对没有影响,实际上可能存在想象不到的错误。
开发工具存在bug,须进行白盒测试,确保程序实际运行结果与预期一致。
=与==
if (x = y)
if (x = 5)
if (5 == x)
x == y;
类似的,&与&&, |与||, <与<<, >与>>
/*案例
y=x/*p;
y = x / *p;
y=x/(*p);
数据类型
问题1:执行以下程序,result_8的值是多少?
uint8_t port = 0x5a ;
uint8_t result_8 ;
result_8 = (~port) > > 4 ;
问题2:执行以下程序,d的值是多少?
uint16_t a = 10 ;
uint16_t b = 65531 ;
uint32_t c = 0 ;
uint32_t d ;
d = a + b + c ;
危险的类型转换
u32x = u16a + u16b;
u32a = (uint32_t) (u16a * u16b);
f64a = u16a / u16b ;
f32a = (float32_t) (u16a / u16b) ;
f64a = f32a + f32b ;
f64a = (float64_t) (f32a + f32b) ;
整数溢出
if ((x + y) > z)
if ((x - y) < 0)
假定a和b是非负整型变量,我们需要检查a+b是否溢出,一种想当然的方式是:
if ((a + b) < 0)
然而,正确的方式是:
if (((unsigned)a + (unsigned)b) > INT_MAX)
第二章 C语言编程规范 来自淘豆网m.daumloan.com转载请标明出处.