zoukankan      html  css  js  c++  java
  • 有趣的IT面试题

    一段看起来很简单C代码,预期结果是输出array数组。

    #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
    ", array[d+1]);
    	return 0;
    }

    代码编译运行后,结果不是想要的那个数组,而是空值,这是很多人就会想到宏定义了,原因是宏定义是没办法获得数组的长度。

    可我们把for循环改一下就有不同的结果了

    	for(d = -1; d <= ((int)TOTAL_ELEMENTS-2); d++) 

    把TOTAL_ELEMENTS强制转换成int类型的,结果就变成了:

    IT面试题

    。。。。。。。。。。这是我们想要的结果,那就是说宏定义没问题。

    我们在原来的main()函数中加一句

    	int array_length = TOTAL_ELEMENTS;

    这样和类型强转的效果应该是一样的,跟踪监视后得到下面的结果:

    IT面试题

    提示是没有找到符号"TOTAL_ELEMENTS",但是array_length却有值。。。。。。。很郁闷

    接着,我们在for循环里处理数组长度

    	for(d = -1; d <= ((sizeof(array) / sizeof(array[0])) - 2); d++)

    现在,输出结果应该就是我们想要的那个数组了。可结果呢,啥都没输出。。。。。。。更郁闷

    那就继续跟踪监视

    IT面试题

    好像都没问题,不过注意它们的类型,是无符号整形(unsigned int),而循环条件d是整形(int),并且d的初始值为-1,不再无符号整形(unsigned int)定义范围之内,现在看来好像是类型的问题了,那我们将循环条件d的初始值改为0试试:

    #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 = 0; d <= (TOTAL_ELEMENTS - 1); d++)
    		printf("%d
    ", array[d]);
    	return 0;
    }

    输出的结果是

    IT面试题

    结果正是我们想要的。没有进行强制类型转换,也没有进行二次赋值,只是将循环条件d的初始值定义在了无符号整形(unsigned int)的范围之内。

    我们再做个小测试

    int main()
    {
        int array[] = {23,34,12,17,204,99,16};
        int d = -1;
        if(d <= (sizeof(array) / sizeof(array[0])) -2)
            printf("先有鸡
    ");
        else
            printf("先有蛋
    ");
        return 0;
    }

    从代码看来,应该是输出“先有鸡”。不过这次结果又是事与愿违,输出的是“先有蛋”。

    所以建议在写代码的时候尽量避免使用无符号类型,同时也尽量避免有符号类型和相应的无符号类型进行比较等。

    ================================================================

    本人才疏学浅和其他原因,没有进行更深入的研究,只是偶尔看到的IT面试题,感兴趣简单的测了一下。

    不过跟踪监视后,CX0017:错误:没有找到符号"TOTAL_ELEMENTS",还是没有找到原因,有知道的大神不妨指点一二。。。。。。

  • 相关阅读:
    POJ3094 UVALive3594 HDU2734 ZOJ2812 Quicksum【进制】
    UVALive5583 UVA562 Dividing coins
    POJ1979 HDU1312 Red and Black【DFS】
    POJ1979 HDU1312 Red and Black【DFS】
    POJ2386 Lake Counting【DFS】
    POJ2386 Lake Counting【DFS】
    HDU4394 Digital Square
    HDU4394 Digital Square
    UVA213 UVALive5152 Message Decoding
    UVA213 UVALive5152 Message Decoding
  • 原文地址:https://www.cnblogs.com/lonzhe/p/3914975.html
Copyright © 2011-2022 走看看