一段看起来很简单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\n", array[d+1]);
return 0;
}

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

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

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

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

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

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

	int array_length = TOTAL_ELEMENTS;

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

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

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

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

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

那就继续跟踪监视

好像都没问题,不过注意它们的类型,是无符号整形(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\n", array[d]);
return 0;
}

输出的结果是

结果正是我们想要的。没有进行强制类型转换,也没有进行二次赋值,只是将循环条件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("先有鸡\n");
else
printf("先有蛋\n");
return 0;
}

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

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

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

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

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

有趣的IT面试题的更多相关文章

  1. [js] 有趣的js面试题,你答对了吗?

    题目1: 回答以下代码,alert的值分别是多少?

  2. 一道有趣的Twitter技术面试题

    来自:http://blog.jobbole.com/50705/ 看下面这个图片” “在这个图片里我们有不同高度的墙.这个图片由一个整数数组所代表,数组中每个数是墙的高度.上边的图可以表示为数组[2 ...

  3. 记一道有趣的Twitter面试题

    微信上的“程序员的那些事”想必是很多码农们关注的公众账号之一,我也是其粉丝,每天都会看看里面有没有什么趣事,前段时间“程序员的那些事”分享了一篇博文<我的Twitter技术面试失败了>挺有 ...

  4. MoreWindows 微软认证专家博客目录(白话算法,C++ STL,windows编程)

    为了方便大家查找和学习,现将本人博客中所有博客文章列出目录. (http://blog.csdn.net/morewindows) 一.      白话经典算法 目前有17篇,分为七大排序和经典面试题 ...

  5. java面试| 精选基础题(2)

    关注微信公众号"java从心",置顶公众号 每天进步一点点,距离大腿又近一步! 阅读本文大概需要6分钟 继续挖掘一些有趣的基础面试题,有错望指出来哈,请赐教~ 1.包装类的装箱与拆 ...

  6. 12个有趣的c语言面试题&nbsp;

    1.gets()函数 问:请找出下面代码里的问题: #include int main(void) { char buff[10]; memset(buff,0,sizeof(buff)); gets ...

  7. 对Thoughtworks的有趣笔试题实践

    记得2014年在网上看到Thoughtworks的一道笔试题,当时觉得挺有意思,但是没动手去写.这几天又在网上看到了,于是我抽了一点时间写了下,我把程序运行的结果跟网上的答案对了一下,应该是对的,但是 ...

  8. 12个有趣的C语言面试题

    摘要:12个C语言面试题,涉及指针.进程.运算.结构体.函数.内存,看看你能做出几个! 1.gets()函数 问:请找出下面代码里的问题: #include<stdio.h> int ma ...

  9. [算法]美团春招笔试题C-求有趣子序列数(DP)

    题目 输入n,以及长度为n的数组元素 输出数组的非空子序列中有多少个"有趣序列"mod 998244353,有趣序列指所有元素满足arr[i]%i == 0, i从0记. 例: 输 ...

随机推荐

  1. SpringMVC原理+流程图

    SpringMVC工作原理:整个处理过程从一个HTTP请求开始:1)DispatcherServlet接收到请求后,根据对应配置文件中配置的处理器映射,找到对应的处理器映射项(HandlerMappi ...

  2. C语言的本质(35)——共享库

    库用于将相似函数打包在一个单元中.然后这些单元就可为其他开发人员所共享,并因此有了模块化编程这种说法- 即,从模块中构建程序.Linux支持两种类型的库,每一种库都有各自的优缺点.静态库包含在编译时静 ...

  3. ###Android 断点调试和高级调试###

    转自:http://www.2cto.com/kf/201506/408358.html 有人说Android 的调试是最坑的,那我只能说是你不会用而已,我可以说Android Studio的调试是我 ...

  4. HDU1242 Rescue(BFS+优先队列)

    Rescue Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Subm ...

  5. OpenWrt修改

    openwrt如何编译修改界面的顶部.底部信息.LOGO图片 2011-06-02 16:20:03  浏览次  以Atheros71xx为例,修改路径为:trunk/build_dir/target ...

  6. 怎样使用LaTeX输入葡萄牙语等语言中的特殊字符

    论文中引用了大名鼎鼎ER random graph model,但是这两位的名字不太好打,发现Google Scholar中直接下载的bib文件中也是错的.找了一会,发现转义字符已经定义得很好了.只是 ...

  7. UVA 1599 Ideal Path(bfs1+bfs2,双向bfs)

    给一个n个点m条边(<=n<=,<=m<=)的无向图,每条边上都涂有一种颜色.求从结点1到结点n的一条路径,使得经过的边数尽量少,在此前提下,经过边的颜色序列的字典序最小.一对 ...

  8. CATransform3D参数的意义

    经常忘记CATransform3D各参数的意思,记下来好好理解下   struct CATransform3D { CGFloat m11(x缩放),m12(y切变),m13(旋转),m14(); C ...

  9. 【组合数学:第一类斯特林数】【HDU3625】Examining the Rooms

    Examining the Rooms Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Othe ...

  10. 美化select的jquery插件

    自己写的一个美化select插件,浏览器自带的实在太丑,还不能用css自定义. 插件主要原理是隐藏原生的select控件,支持select上设置change事件. 脚本 /* * iSelect * ...