前几天自己写了一段BCD的求和函数,
一次加了四个数据。
结果测试时,发现结果错的一塌糊涂,分析了半个小时,最后得出的结论是这种写法有问题。
但错在哪里,很真不知道。
只好拆开来计算,结果就是对的。后来同事提醒说是不是括号出问题了。
如梦方醒,
再看下程序,
发现&,>>运算和+一起运算,却没有括号改变运算顺序,
这不出错也难。
后来改正后,
再测试和之前单个相加,也一样了。
一个括号,酿成的悲剧。
所以在多优先级运算时,像《C专家编程》里讲的还是加上括号好些,
也不用去考虑因为优先级不对出现的错误了,至少避免的错误出现的可能性。
最近在检查代码时,又发现早前犯下的因为优先级造成的错误,赶紧改过来了。
看来以后写的时候,括号还是加上为妙。有时候可能会看起来复杂,
但是很容易分清,每一部分的作用,也不用去背优先级,虽然有些取巧,
但确实能避免不少的bug。
测试代码如下(分开相加):
int bcd2sum(unsigned char * disData, unsigned char * srcData)
{
unsigned char * srcd = srcData;
unsigned char * disd = disData;
unsigned char apoint;
unsigned char bpoint;
unsigned char carriedflag = 0;
unsigned char i;
for(i = 0; i < 5; i++)
{
apoint = srcData[i] & 0x0f;
apoint += srcData[i + 5] & 0x0f;
printf("apoint: %x ", apoint);
apoint += srcData[i + 10] & 0x0f;
apoint += srcData[i + 15] & 0x0f;
apoint += carriedflag;
disData[i] = apoint % 10;
carriedflag= apoint / 10;
printf("apoint: %x, ca: %d, src: %x\n", apoint, carriedflag, srcData[i] & 0x0f);
bpoint = srcData[i] >> 4;
bpoint += srcData[i + 5] >> 4;
printf("bpoint: %x ", bpoint);
bpoint += srcData[i + 10] >> 4;
bpoint += srcData[i + 15] >> 4;
bpoint += carriedflag;
disData[i] |= (bpoint % 10) << 4;
carriedflag= bpoint / 10;
printf("bpoint: %x, ca: %d, src: %x\n", bpoint, carriedflag, srcData[i] >> 4);
}
return i;
}
加上括号的情况:
int bcd2sum(unsigned char * disData, unsigned char * srcData)
{
unsigned char * srcd = srcData;
unsigned char * disd = disData;
unsigned char apoint;
unsigned char bpoint;
unsigned char carriedflag = 0;
unsigned char i;
for(i = 0; i < 5; i++)
{
apoint = (srcData[i] & 0x0f) + (srcData[i + 5] & 0x0f) + (srcData[i + 10] & 0x0f) + (srcData[i + 15] & 0xf) + carriedflag;
disData[i] = apoint % 10;
carriedflag= apoint / 10;
printf("apoint: %x, ca: %d, src: %x\n", apoint, carriedflag, srcData[i] & 0x0f);
bpoint = (srcData[i] >> 4) + (srcData[i + 5] >> 4) + (srcData[i + 10] >> 4) + (srcData[i + 15] >> 4) + carriedflag;
disData[i] |= (bpoint % 10) << 4;
carriedflag= bpoint / 10;
printf("bpoint: %x, ca: %d, src: %x\n", bpoint, carriedflag, srcData[i] >> 4);
}
return i;
}