第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语言中变量修改的最晚时机

时间: 2024-08-04 02:03:51

第44课 函数参数的秘密(上)的相关文章

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

函数参数: 函数参数的求值顺序依赖于编译器的实现: 第一感觉,这个函数会输出1和2,k的最终值会变成3. 示例程序: 1 #include <stdio.h> 2 3 int func(int i, int j) 4 { 5 printf("%d, %d\n", i, j); 6 7 return 0; 8 } 9 10 int main() 11 { 12 int k = 1; 13 14 func(k++, k++); 15 16 printf("%d\n&q

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

参数入栈顺序: 调用约定: gcc语言默认使用__cdecl调用约定.调用约定不是语言的一部分,是编译器的一部分. 调用约定使用的最典型的地方就是库函数的调用.因为库的编译方式我们的自己的程序的编译方式可能不一样. 小问题: 如何编写一个计算n个数平均值的函数? 示例程序: 1 #include <stdio.h> 2 3 float average(int array[], int size) 4 { 5 int i = 0; 6 float avr = 0; 7 8 for(i=0; i&

第7课 函数参数的扩展

1.  函数参数的默认值 (1)C++中可以在函数声明时为参数提供一个默认值(注意是声明,不能在定义中提供) (2)当函数调用时没有提供参数的值,则使用默认值 [实例分析]默认参数值初探 #include <stdio.h> //默认值只能在函数声明时提供 int mul(int x = 0); //参数x的默认值为0 int main() { printf("%d\n", mul()); //传入默认值0 printf("%d\n", mul(-1))

AGG第六课 函数参数使用弧度

2.1 定义 所谓"弧度的定义"就是说,1弧度的角大小是怎样规定的? 我们知道"度"的定义是,"两条射线从圆心向圆周射出,形成一个夹角和夹角正对的一段弧.当这段弧长正好等于圆周长的360分之一时,两条射线的夹角的大小为1度. 那么,弧度又是怎样定义的呢? 弧度的定义是:两条射线从圆心向圆周射出,形成一个夹角和夹角正对的一段弧.当这段弧长正好等于圆的半径时,两条射线的夹角大小为1弧 摘自:http://sourceforge.net/p/vector-agg

C之函数参数(三十九)

我们上节博文讲了函数的意义,那么我们今天来讲下函数参数.函数参数在本质上与局部变量相同在栈上分配空间,函数参数的初始值是函数调用时的实参值.用下图来实际说明 函数参数的求值顺序依赖于编译器的实现,我们来看看下面代码的输出是什么?为什么呢? #include <stdio.h> int func(int i, int j) {     printf("i = %d, j = %d\n", i, j);          return 0; } int main() {    

第8课 函数重载分析(上)

重载(Overload): C++中的函数重载: 函数重载示例: 1 #include <stdio.h> 2 #include <string.h> 3 4 int func(int x) 5 { 6 return x; 7 } 8 9 int func(int a, int b) 10 { 11 return a + b; 12 } 13 14 int func(const char* s) 15 { 16 return strlen(s); 17 } 18 19 20 int

第20课 可变参数模板(1)_模板参数包和函数参数包

1.  参数包(parameter pack) (1)模板参数包(以tuple为例):template<typename- Elements>class tuple ①Elements标识符的左侧使用了省略号,在C++11中Elements被称为"模板参数包",表示可以接受任意多个参数作为模板参数. ②编译器将多个模板参数打包成"单个"的模板参数包,如tuple<int, char, double>实例化模板类时,Element就是包含int

一起入门python7之函数参数

上一节课简单的讲了一下函数.那么今天来给大家讲一下函数参数.用案例说话哈.上一节课只是让大家有比较简单的了解,那么这节我们来细化一下哈.>>>def hello(x):        #这里的x就是参数return x * x>>>hello(2)               #自动将x=2带入x*x当中去计算了.故得四.4>>>#大家想一下,倘若是次方的该怎么办?比如x的n次方.>>> def wa(x,n):    #首先先定义两

第9课 - 函数定义及调用

第9课 - 函数定义及调用 1. makefile中的函数 (1)make 解释器提供了一系列的函数供 makefile 调用 (2)在 makefile 中支持自定义函数实现,并调用执行 (3)通过 define 关键字实现自定义函数 2. 在makefile中自定义函数 (1)自定义函数的语法 其中,$(0) 代表被调用的函数名,$(1) , $(2) , $(3) ... 代表调用函数时后面的传参 (2)深入理解自定义函数 - 自定义函数是一个多行变量,无法直接调用 - 自定义函数是一种过