一段看起来很简单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. Equations(hdu 1496 二分查找+各种剪枝)

    Equations Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total S ...

  2. 动态加载JS过程中如何判断JS加载完成

    在正常的加载过程中,js文件的加载是同步的,也就是说在js加载的过程中,浏览器会阻塞接下来的内容的解析.这时候,动态加载便显得尤为重要了,由于它是异步加载,因此,它可以在后台自动下载,并不会妨碍其它内 ...

  3. NOI十连测 第六测 T3

    思路:考试的时候我非常地**,写了圆并,然后还TM写了半平面交和三角剖分,虽然只有30分..但是看在我写了500行的份上还是挂着吧.. #include<cstdio> #include& ...

  4. 安卓手机用-----Exchange Activesync---同步Gmail日历联系人

    微软Exchange Activesync是一个跨平台的移动设备同步协议 支持很多手机操作系统,比如诺基亚的塞班.黑莓的palm.WindowsMobile.Iphone.安卓等.这些手机上都可以用这 ...

  5. HtmlNodeType枚举

    HtmlNodeType是一个枚举,用于说明一个节点的类型. 源代码如下所示: public enum HtmlNodeType { Document = 0, Element = 1, Commen ...

  6. Linux系统启动过程介绍

    Linux系统启动过程介绍 学习操作系统有必要了解一下系统的启动过程,这样在面对各种系统故障的时候能快速定位解决问题,下面以Centos来分析linux系统的启动过程. 1.BIOS自检:当开机的时候 ...

  7. LeeCode-Delete Node in a Linked List

    Write a function to delete a node (except the tail) in a singly linked list, given only access to th ...

  8. C:\Program Files (x86)\Common Files\microsoft shared\TextTemplating\11.0

    Generating Files with the TextTransform Utility \Program Files\Common Files\Microsoft Shared\TextTem ...

  9. MD5加密算法(转)

    获取字符串的MD5摘要 原文更详细: http://www.weixuehao.com/archives/474 代码如下: import java.security.MessageDigest; p ...

  10. 认识Log4j

    Log4j是一个非常强大的log记录软件,下面我们就来看看在项目中如何使log4j. 首先当然是得到log4j的jar档,推荐使用1.2.X版,下载地址: http://logging.apache. ...