优先级引起的错误(括号还是很有用的)。

前几天自己写了一段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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值