1.一个微妙的BUG
在下面的代码中,if表达式的值不是真,为什么?
int array[]={ 23,34,12,17,204,99,16 };#define TOTAL_ELEMENTS (sizeof(array)/sizeof(array[0]))
main(){ int d=-1,x; /*........*/
if(d<=TOTAL_ELEMENTS-2) X=array[d+1]; /*.....*/
}
原因:sizeof()的返回类型是无符号数,所以TOTAL_ELEMENTS是unsigned类型,if 语句在singed int 和 unsigned int 之间测试相等性,所以d被升级为unsigned int类型,-1转换成unsinged int 的结果将是一个非常巨大的整数,到使表达式的值为假.
要修正,只要对TOTAL_ELEMENTS进行强制类型转换即可:
if(d<=(int)TOTAL_ELEMENTS-2)
小启发:尽量不要用无符号数,虽然无符号数不存大负数.在写程序时要注意到数据类型的升级情况.在调用函数时要注意它的返回类型.
转载于:https://www.cnblogs.com/gumupai/archive/2005/12/19/299978.html
相关资源:数据结构—成绩单生成器