您的位置:首页 > 编程语言 > C语言/C++

关于一个c语言中的小陷阱(数据类型之间的转换)

2014-03-01 22:47 435 查看
在周师兄处看到这样一小段代码:
#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;
}


当时虽然觉得有点奇怪,不过也自以为没什么可看的,输出一个数组么。
不过一运行,就坑爹了-------控制台里一行输出都没有!!什么情况。。。
后来搞了半天,总算弄清楚了:sizeof()运算符返回的数据类型为unsinged int,而d为int。当int 与 unsigned int进行运算时,int会自动转换成unsigned int,而d为32位,-1的int型为全1。当d转换成unsigned后,d就变成了一个很大的数,为2^32-1.如此一来,在for语句的<=判断时,d自然大于(TOTAL_ELEMENTS-2)。后者仅仅等于5.所以for循环的第1次条件判断就没有通过,自然就进不了循环体了。
可以这样改:

for(d=-1;d <= (int)(TOTAL_ELEMENTS-2);d++)
printf("%d\n",array[d+1]);

在运算之前将后者强制转换为int型。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: