认清sizeof()——远离Bug

先看代码

#include 

int array[] = {12,23,34,45,56,67,78};
#define TOTAL_ELEMENTS (sizeof(array)/sizeof(array[0]))

int main()
{
	int d = -1;
	
	if(d <= TOTAL_ELEMENTS)
	{
		printf("输出1");
	}	
	else 
	{
		printf("输出2");
	}
		
   return 0;
}

看完你认为输出多少,大部分人可能会毫不犹豫就认为是:输出1。(-1<= 7),明显正确嘛。。。

如果真是这么简单,你就错了,真实答案是:输出2


原因呢是因为sizeof()的返回类型是无符号数,也就是TOTAL_ELEMENTS 是一个无符号数,d是有符号数;无符号数(unsigned int)和有符号数(signed int)之间测试相等性时,有符号数 d 会被升级为 unsigned int 类型,-1 转换成 unsigned int的结果将是一个非常巨大的正整数(65535),致使表达式结果为假。

要修正此问题只需要对 TOTAL_ELEMENTS 进行强制类型转换即可。
如:if(d <= (int)TOTAL_ELEMENTS )

在线测试入口

PS:#define TOTAL_ELEMENTS (sizeof(array)/sizeof(array[0]))
这里使用sizeof(array[0])而不是使用sizeof(int)是因为前者可以在不修改#define 语句的情况下改变数组的基本类型(比如,把 int 变成 char)


此 bug 在ANSI C中存在,如果 K&R C 的某种编译器的 sizeof() 的返回值是无符号数,那么这个bug也存在

你可能感兴趣的:(C/C++笔记)