打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
有趣的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\n", array[d+1]);	return 0;}

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

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

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

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

一段看起来很简单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",还是没有找到原因,有知道的大神不妨指点一二。。。。。。

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

我们在原来的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",还是没有找到原因,有知道的大神不妨指点一二。。。。。。

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
c puzzles
C 数据类型 整理
“整数数据类型”+“各种类型的编码”+“类型转换” 的细节过程
(C语言中的“物种”)乐创DIY C语言讲义​——3.2节
15W4K58S4 实验5:强制类型转换与指针的运用
字节对齐详解
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服