asuerhao's Blog

如果有什么做的不到的地方请尽管留言, 我会改进的 : )

C 数据类型转换

    看一下段代码, 分析for循环的循环体会执行多少次:

#include<stdio.h>
int main(void)
{
	int i;
	for(i=-1; i < sizeof(int); i++) {
		printf("%d, ", i);
	}
	return 0;
}

    实验表明, 在不同的编译器下, 这个循环的实现也不一样:

    1. 在gcc下, 由于'sizeof(int)'的返回值是'unsigned long int'类型的, 但'i'的类型是'signed int'类型的, 二者在做比较时要将i从'signed int'转换成'unsigned long int', 但由于i原来是有符号的'-1', 转换后变为无符号的'0xffffffff', 当然比'sizeof(int)'大, 结果for循环体一次也没有执行.

    2. 在Turbo C下, 由于'sizeof(int)'的返回值是'signed int'类型的(注意: 这不符合C标准的规定), 所以与'i'比较是没有类型转换, for循环体会执行5次.

    严重注意: 有些东西了解就行, 以便在出现问题时知道如何解决, 但尽量不要在自己的代码中尝试那些东西.