一段看起来很简单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. Response 关于浏览器header的方法

    Response.AddHeader   Response.AddHeader使用实例 1.文件下载,指定默认名 Response.AddHeader("content-type" ...

  2. Ecstore中的微信支付怎么样配置

    要在Ecstore中开启微信支付,需要先在后台/应用中心中安装“移动商城”和“微信商城管理”这两个App移动商城App是ecstore的手机wap版,可在手机浏览器中实现商城的B2c购物功能.“微信商 ...

  3. img元素高度多出来的几像素

    HTML: <div class="test"><img src="body2.jpg" alt=""></d ...

  4. 在Python3.5下安装和测试Scrapy爬网站

    1. 引言 Scrapy框架结构清晰,基于twisted的异步架构可以充分利用计算机资源,是爬虫做大的必备基础.本文将讲解如何快速安装此框架并使用起来. 2. 安装Twisted 2.1 同安装Lxm ...

  5. python之安装

    1.python控制软件pyenv 依赖软件:git [root@localhost ~]# curl https://raw.github.com/yyuu/pyenv-installer/mast ...

  6. linux bugfree 安装

    前段时间用了下bugzilla,请参考:linux bugzilla nginx 安装配置 详解,感觉不是很好用.下面说一下,bugfree的安装 bugfree3.0.1是用php的yii框架开发的 ...

  7. jdbc 通过rs.getString()获取数据库中的时间字段问题

    例如在mysql中的一张表中存在一个字段opr_time为datetime类型, 在JDBC 中通过rs.getString("opr_time");来获取使会在日期后面添加&qu ...

  8. Qt中实现启动画面(延时过程中要加上app.processEvents())

    纵所周之,当一个程序的启动比较耗时的时候,为了不让用户枯燥的等待或者是误以为程序运行异常了,所以我们都会在启动比较耗时的程序中加上启动界面 ,例如office软件等等. 在Qt中实现启动界面,主要就是 ...

  9. VS Visual Studio connection(); Microsoft Visulal Studio vNext & Azure

    http://www.visualstudio.com/connect-event-vs

  10. 剑指offer-面试题8.旋转数组的最小数字

    题目:把一个数组最开始的若干个元素搬到数据的末尾,我们称之为 数组的旋转.输入一个递增排序的数组的一个旋转,输出旋转数组 的最小元素.例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转, ...