关于一个c语言中的小陷阱(数据类型之间的转换)
2014-03-01 22:47
435 查看
在周师兄处看到这样一小段代码:
当时虽然觉得有点奇怪,不过也自以为没什么可看的,输出一个数组么。
不过一运行,就坑爹了-------控制台里一行输出都没有!!什么情况。。。
后来搞了半天,总算弄清楚了: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次条件判断就没有通过,自然就进不了循环体了。
可以这样改:
在运算之前将后者强制转换为int型。
#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型。
相关文章推荐
- C语言陷阱---数据溢出和类型转换
- 面试题: 看下面的程序是否有问题 如果有问题请指出 并说明 (关于数据类型-隐性转换的小陷阱)
- 网络通信中,DELPHI的string类型数据转换为C++字符串发送的一个陷阱
- 关于java 基本数据类型之间的转换
- 关于java基本数据类型之间的转换
- 积跬步,聚小流------关于数据类型转换的一个面试题
- C语言中数据类型转换“陷阱”
- C语言的一个关于类型的小陷阱
- 关于java 基本数据类型之间的转换
- Python数据类型之间的转换 函数 描述 int(x [,base]) 将x转换为一个整数 long(x [,base] ) 将x转换为一个长整数 float(x) 将x转换到一个浮点数
- 关于java基本数据类型之间的转换
- 关于基本数据类型转换的一个小问题
- 关于C#数据类型之间转换的问题!
- C语言中数据类型之间怎样进行强制转换?
- C语言_基本数据类型范围、类型之间的转换规则、打印某个内存连续的内存值
- 关于C#数据类型之间转换的讨论
- 关于C#数据类型之间转换的讨论
- T-SQL: 关于 Varbinary(Hex,Int) 与 Varchar(HexString) 之间的(数据类型)转换
- 关于C#数据类型之间转换的问题
- 关于C#数据类型之间转换的讨论