有趣的IT面试题

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

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

  1. #include<stdio.h> 
  2. #define TOTAL_ELEMENTS (sizeof(array) / sizeof(array[0]))  
  3. int array[] = {23,34,12,17,204,99,16};  
  4. int main()  
  5. {  
  6.     int d;  
  7.     for(d = -1;d <= (TOTAL_ELEMENTS - 2); d++)  
  8.         printf("%d\n", array[d+1]);  
  9.     return 0;  

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

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

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

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

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

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

  1. int array_length = TOTAL_ELEMENTS

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

IT面试题

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

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

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

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

那就继续跟踪监视

IT面试题

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

  1. #include<stdio.h> 
  2. #define TOTAL_ELEMENTS (sizeof(array) / sizeof(array[0]))  
  3. int array[] = {23,34,12,17,204,99,16};  
  4. int main()  
  5. {  
  6.     int d;  
  7.     for(d = 0; d <= (TOTAL_ELEMENTS - 1); d++)  
  8.         printf("%d\n", array[d]);  
  9.     return 0;  

输出的结果是

IT面试题

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

我们再做个小测试

  1. int main()  
  2. {  
  3.     int array[] = {23,34,12,17,204,99,16};  
  4.     int d = -1;  
  5.     if(d <= (sizeof(array) / sizeof(array[0])) -2)  
  6.         printf("先有鸡\n");  
  7.     else  
  8.         printf("先有蛋\n");  
  9.     return 0;  

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

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

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

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

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

原文链接:http://www.cnblogs.com/lonzhe/p/3914975.html

责任编辑:牛小雨 来源: 龍^o^少的博客
相关推荐

2023-08-27 15:57:28

前端开发

2020-06-04 14:40:40

面试题Vue前端

2011-03-24 13:27:37

SQL

2023-11-13 07:37:36

JS面试题线程

2015-09-02 09:32:56

java线程面试

2010-11-26 10:53:29

戴尔

2020-09-21 11:10:06

Docker运维面试

2014-07-15 11:10:01

面试题面试

2009-06-06 18:36:02

java面试题

2009-06-06 18:34:05

java面试题

2013-05-29 10:23:36

Android开发移动开发Java面试题

2009-06-16 14:03:16

Hibernate面试Hibernate面试

2021-02-23 12:43:39

Redis面试题缓存

2020-11-05 10:01:35

系统设计软件

2021-09-09 08:54:48

SpringAOP面试题AOP事务

2018-07-10 16:50:28

数据库MySQL面试题

2014-12-02 10:02:30

2009-06-02 15:30:35

Hibernate面试笔试题

2018-03-08 18:40:47

Java百度面试题

2023-07-14 08:12:21

计时器unsafecontext
点赞
收藏

51CTO技术栈公众号