C语言笔试题

描述

来看一个C语言笔试题,应该很少有人能给出正确答案。

#include 


int 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语言官方文档,确实提到了这一点,函数参数的计算顺序属于为指定行为。

之所以未指定,是想让编译器充分利用自身架构的特点,所以在写代码的时候,不要依赖他们的计算顺序。
 

 

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分