关于函数调用涉及到的知识点的归纳

本文介绍了C语言中函数调用的相关知识点,包括定义与初始化的区别、顺序点的概念、函数参数的默认认定、可变参数列表的使用以及函数设计的最佳实践。通过实例解析了函数调用的顺序和可变参数列表的实现,并强调了避免使用全局变量、参数命名的重要性以及指针作为输入参数时应使用const限定。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、定义跟初始化的区别

声明:可理解为预先告诉编译器实体的存在,但我们不知道它存在的位置。

  char  a;

定义:可理解为明确指示编译器实体的意义,有确切的空间地址

  char  a=5;

二、程序中的顺序点

顺序节点:指的程序语句执行过程中修改变量值的最晚时刻;

顺序点有:

1.每个完整表达式结束时;

2.&&,||,?,:以及逗号表达式的每个运算对象计算之后

3,,函数调用中对所有实际参数的求值完成之后(进入函数体之前)

三、函数的缺省认定

C语言会默认没有函数类型的函数参数为int 

f(i,j)

  {

   }

等价于

int  f(int  i,int   j)

{

}



经典例子:

int   f(int i,j)

{

   printf("%d,%d\n",i,j);

}

int  main

{

     int  k=1;

     f(k,k++);

     printf("%d\n",k);

     return   0;

}




最后输出结果为  2,1,2

函数的调用依赖于编译器,以顺序点来分析:

上面函数执行f(k,k++);的步骤我们可分解为:

第一步:.还没到顺序点时:i、j都为1;

第二步:当遇到顺序符“ ;”时,由于k的值已经为2,

所以返回值i=2;由于运行k++时,k的值存在记录表

的临时变量域中,所以k的值为1;


四、可变的参数列表

1、C语言中可以定义参数可变的函数

2、可变的参数列表涉及到stdarg.h、

va_list、va_start、va_end、va_arg

例子:

#include <stdio.h>
#include <stdarg.h>


float average(int n, ...)
{
    va_list args;
    int i = 0;
    float sum = 0;
    
    va_start(args, n);
    
    for(i=0; i<n; i++)
    {
        sum += va_arg(args, int);
    }
    
    va_end(args);
    
    return sum / n;
}


int main()
{
    printf("%f\n", average(5, 1, 2, 3, 4, 5));
    printf("%f\n", average(4, 1, 2, 3, 4));
    
    return 0;
}

五、函数设计的技巧

1.尽量不要在函数中使用全局变量

2.参数名要能够体现参数的意义

3,如果参数是指针,且仅作输入参数用,则应在类型前加const,以防止该指针在函数体内意外修改

4.不要省略返回值类型,没有返回值时,要用void声明

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值