C语言基本类型的强制类型转换

平时在使用不同类型进行比较或者运算时,如果我们不进行显示类型转化时,编译器都会进行隐式转换,但是隐式转换往往会带来一下注意不到的错误点,下面就是一例:

#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语言类型强制转换的都知道,

如果一个运算符(非赋值运算)两边的运算数类型不同,先要将其转换为相同的类型,即较低类型转换为较高类型,然后再参加运算,转换规则如下图所示(详细见
http://baike.baidu.com/link?url=mqglJ2eNZHa3E7YGUcgb8d6edr13pi4hP1S-u0SKy79-QOizMxD73QAuYXXqgYHdvcnNxZq8JRNMtdvK1TxJAK):
double ←── float 高
long
unsigned
int ←── char,short 低

在进行<=比较运算时,会将d(-1)强制转换成unsigned int型,这样就会跳过for循环的输出。

所以只要对for语句中的判断语句进行强制类型转换就可以实现程序的正确输出了。

而如果是赋值运算的话,那么会自动从右边转换为左边类型。

 

所以,我们在进行运算的时候,一定要注意运算符两边的数据类型是否相同,如果不相同需要用到强制类型转换的时候,一定要显示的把强制转换写出来,如果寄希望于编译器的隐式转换,那么就要担上出问题的风险了。

今日题目来源:http://www.gowrikumar.com/c/

 

posted on 2014-03-01 21:55  楠哥1991  阅读(1052)  评论(0编辑  收藏  举报

导航