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

来源:互联网 发布:linux下部署jenkins 编辑:程序博客网 时间:2024/06/09 11:07
在周师兄处看到这样一小段代码:
#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型。


0 0