来看一个C语言笔试题,应该很少有人能给出正确答案。
#includeint f(){ printf("this is f ... "); return 1; } int g(){ printf("this is g ... "); return 2; } int main() { printf("%d %d ", f(), g()); return 0; }
代码很简单,函数 f 输出一个字符串,返回整数 1。
函数 g 输出一个字符串,返回整数 2。
主函数中用 printf 输出两个函数的函数值,后面的参数一个是函数 f,一个是函数 g。
运行程序应该会有三行输出,两个函数输出两个,主函数中再打印两个数字。
问题是,这三个输出的顺序应该是什么样的?有没有同学能看出答案,可以写在评论区。
运行程序,先打印 g,再打印 f,最后输出 1 2。
这个结果确实耐人寻味,先调用了函数 g,然后再调用函数 f,写在前面的反而最后调用。
不过这还没结束,再来换个 ARM 平台。
相同的代码,这次却先输出 f,再输出 g,顺序和参数的顺序一致。
好像已经看出了结果,调用的顺序不一定,得看编译器。
最后,再来看下C语言官方文档,确实提到了这一点,函数参数的计算顺序属于为指定行为。
之所以未指定,是想让编译器充分利用自身架构的特点,所以在写代码的时候,不要依赖他们的计算顺序。
-
C语言
+关注
关注
180文章
7605浏览量
136959 -
代码
+关注
关注
30文章
4791浏览量
68669
原文标题:又一个无解笔试题
文章出处:【微信号:学益得智能硬件,微信公众号:学益得智能硬件】欢迎添加关注!文章转载请注明出处。
发布评论请先 登录
相关推荐
评论