zoukankan      html  css  js  c++  java
  • 一个简单的C语言题背后的故事

      最近看到了一个C语言问题,是要计算出这个函数的输出:

    #include <stdio.h>

    int Test(int x,int y, int z)
    {
    printf("x,y,z:%d,%d,%d ",x,y,z);
    return 0;
    }

    int main()
    {
    int a=0;
    Test(a++,a++,a++);
    return 0;
    }

      答案结果是2,1,0.可能会超出很多C程序员的想想,到底是为什么呢?

      查了一直些文献得知,参数入栈顺序是和具体编译器实现相关的。比如,Pascal语言中参数就是从左到右入栈的,有些语言

    中还可以通过修饰符进行指定,如Visual C++.即然两种方式都可以,为什么C语言要选择从右至左呢?

      进一步发现,Pascal语言不支持可变长参数,而C语言支持这种特色,正是这个原因使得C语言函数参数入栈顺序为从右至左。

    具体原因为:C方式参数入栈顺序(从右至左)的好处就是可以动态变化参数个数。通过栈堆分析可知,自左向右的入栈方式,最前

    面的参数被压在栈底。除非知道参数个数,否则是无法通过栈指针的相对位移求得最左边的参数。这样就变成了左边参数的个数

    不确定,正好和动态参数个数的方向相反。

      因此,C语言函数参数采用自右向左的入栈顺序,主要原因是为了支持可变长参数形式。换句话说,如果不支持这个特色,C语

    言完全和Pascal一样,采用自左向右的参数入栈方式。

  • 相关阅读:
    hdu 1017 A Mathematical Curiosity 解题报告
    hdu 2069 Coin Change 解题报告
    hut 1574 组合问题 解题报告
    hdu 2111 Saving HDU 解题报
    hut 1054 Jesse's Code 解题报告
    hdu1131 Count the Trees解题报告
    hdu 2159 FATE 解题报告
    hdu 1879 继续畅通工程 解题报告
    oracle的系统和对象权限
    oracle 自定义函数 返回一个表类型
  • 原文地址:https://www.cnblogs.com/dylancao/p/8523767.html
Copyright © 2011-2022 走看看