这几天逛论坛,偶然间看到一个很有意思的程序,就拿过来研究一个。程序如下:
- #define ELE_NUM(a) (sizeof(a)/sizeof(a[0]))
- int main(int argc, char *argv[])
- {
- char array[] = {'E', 'M','C'};
- int d;
- for (d = -1; d <= (ELE_NUM(array) - 2); d++)
- {
- printf("%d",array[d+1]);
- }
- return 0;
- }
上面的程序的输出结果是什么?我想如果这样一道题用这样的方式展现出来的话,肯定有很多人开始怀疑自己心中的结果了。“要西,这个程序肯定有猫腻吧……”,呵呵,确实,这道题要是真的不自己亲手敲一敲,直接直接说的答案很多都是错的,
正确的结果是,什么也没有显示出来。解释起来很简单。但能想起来还是要扎实的基础。。感觉都知道,但遇到问题就想不起来。。就是基础不牢。。仔细看《深入理解计算机系统》..sizeof()返回size_t属于unsigned int 类型,ELE_NUM(array) - 2返回unsigned int 类型。d为int,为-1,用其与unsigned int比较时,自动转换为unsigned int。编译器没有warnning(最烦的事情,也是最好的事情。。唉。。)此时d 为-1,转换为一个超大数42000 000 00 000 什么的,循环直接退出,什么都不会输出的。
就这一个题来说吧,足以见得一些很基础的问题在一定情况下如果不注意还是会产生很大的后果的。基础很重要呀。!!!
转载于:https://blog.51cto.com/yiluohuanghun/1084917