平时在使用不同类型进行比较或者运算时,如果我们不进行显示类型转化时,编译器都会进行隐式转换,但是隐式转换往往会带来一下注意不到的错误点,下面就是一例:
#include<stdio.h>
#define TOTAL_ELEMENTS (sizeof(array) / sizeof(array[0]))
int array[] =
{23,34,12,17,204,99,16};
int main()
{
int d;
for(d=-1;d <= (TOTAL_ELEMENTS-2);d++)
printf("%d\n",array[d+1]);
return 0;
}
程序的愿意图是为了输出int数组内部的数据,但是程序没有按照我们的意图输出。
调试发现,for循环竟然没有进入,然后通过添加语句输出d和TOTAL_ELEMENTS的值也是我们预料之中的,那么问题肯定就是出现在类型上面了。
sizeof()返回的是unsigned int类型的数据,所以TOTAL_ELEMENTS 的数据类型就是unsigned int类型,看过C语言类型强制转换的都知道,
在进行<=比较运算时,会将d(-1)强制转换成unsigned int型,这样就会跳过for循环的输出。
所以只要对for语句中的判断语句进行强制类型转换就可以实现程序的正确输出了。
而如果是赋值运算的话,那么会自动从右边转换为左边类型。
所以,我们在进行运算的时候,一定要注意运算符两边的数据类型是否相同,如果不相同需要用到强制类型转换的时候,一定要显示的把强制转换写出来,如果寄希望于编译器的隐式转换,那么就要担上出问题的风险了。
今日题目来源:http://www.gowrikumar.com/c/