第44课 函数参数的秘密(上)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第44课 函数参数的秘密(上)相关的知识,希望对你有一定的参考价值。

1. 函数参数

(1)函数参数在本质上与局部变量相同,都在栈上分配空间

(2)函数参数的初始值是函数调用时的实参值

技术分享 

(3)函数参数的求值顺序依赖于编译器的实现(注意:这里指求值顺序而不是入栈顺序!)

【实例分析】函数参数的求值顺序

#include <stdio.h>

int func(int i, int j)
{
    printf("i = %d, j = %d\\n",i, j);
    return 0;
}

int f()
{
    printf("f() Call...\\n");
    return 1;
}

int g()
{
    printf("g() Call...\\n");
    return 2;
}

int main()
{
    int k = 1;
    int a = 0;

    func(k++,k++); //gcc、vc、bcc:2,1

    printf("k = %d\\n", k); //3

    a = f() * g(); //*两侧的操作数顺序也不是固定的,vc、gcc:f()先被调用,然后g()

    return 0;
}

2. 程序中的顺序点

(1)程序中存在一定的顺序点

(2)顺序点指的是执行过程中修改变量值的最晚时刻

(3)在程序到达顺序点的时候,之前所做的一切操作必须完成

3. C语言中的顺序点

(1)每个完整表达式结束时,即分号处

(2)&&、||、?:、逗号表达式的每个参数计算之后

(3)函数调用时所有实参求值完成后(进入函数体之前)

【编程实验】程序中的顺序点

 

4. 小结

(1)函数的参数在栈上分配空间

(2)函数的实参并没有固定的计算次序

(3)顺序点是C语言中变量修改的最晚时机

 

以上是关于第44课 函数参数的秘密(上)的主要内容,如果未能解决你的问题,请参考以下文章

第45课 函数参数的秘密(下)

第33课 main函数与命令行参数

第57课 深入理解函数模板

C语言-第36课 - 函数递归与函数设计技巧

第3课 浮点数的秘密

第5课 引用的本质分析