您的位置:首页 > 其它

yes or no

2010-09-08 17:11 141 查看
首先附上一段代码,猜猜它的运行结果是什么:

#include <stdio.h>
#define SIZE(a) ( (sizeof(a)) / (sizeof(a[0])) )
int main(void)
{
int a[5];
int b = -1;
if(SIZE(a) > b)
printf("yes/n");
else
printf("no/n");
}


首先,这段程序有一个亮点,就是第二句的宏定义,不过可能大多数人都知道,就是用来求数组长度的一个宏,应该是比较好理解的,我就不多说了。其实重点是这段程序的执行结果是什么,再往下看,就是定义了一个数组长度为5的数组a,又定义了一个int型的变量b,并赋初值为-1,下面就是判断数组a的长度与b的值谁大谁小,数组长度大的话输出yes,b的值大的话输出no。光看程序会让人觉得结果显而易见,当然是5大于-1啊,就是数组长度大于b,结果应该是输出yes!但是结果是肯定的,应该是no,原因是如果是yes,我就不用写到这来了。

额,当然,上面说的那个原因只是其一,而且是很不重要的一个。废话不多说,简单分析一下,既然输出了no,那就说明程序运行了SIZE(a) <= b 这句话了,也就是5<=-1,这显然不可能,那就再往上看,-1是int型的变量b的值,而5是通过sizeof(a) / sizeof(a[0]) 计算得到的,而sizeof得到的返回值类型为unsigned int,也就是说这个5的类型是unsigned int 的,对于 if(SIZE(a) > b) 这句话来说, “>”左边的类型是unsigned int ,右边是int,类型是不一致的,所以就进行了隐式的强制类型转换,而隐式转换基本都是向大方向转换,这里unsigned int要比int大,所以把int型的b转换成unsigned int 类型,也就是把-1变成了一个相当大的数字了,也就必然比5大,所以最后会输出no。

这段程序的启示其实很多,首先,让我记住sizeof的返回值是unsigned int型的,其次,unsigned int 与 int 其实是很不相同的,三,对于隐式的强制类型转换,其实是在我们编程中很不会注意到德尔地方,但是正因为它的不可见性,所以可能会导致这样或那样的奇怪错误,而且还是一时很难找出来的,其实对于上段程序来说,想要修改成想要的程序其实很简单,只要把 if(SIZE(a) > b) 改为 if((int)SIZE(a) > b) 就行了。

还是那句话,以上纯属个人见解,不代表官方。自己的地方,自己做主,呵呵,在错误中成长,在改错中进步。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: