【C语言学习笔记】翁恺课程(3)

7.  函数

将中间高亮部分定义为自定义函数,main中调用该函数进行处理。这个isPrime还可用在别的程序中。

程序中出现几段几乎完全相似的代码,“代码复制”是程序不良的表现。因为将来做修改、维护的时候要维护很多处。

 什么是函数?

函数是一块代码,接收零个/多个参数做一件事情,并返回零个/一个值。
可想像为数学中y = f(x)

函数定义

调用函数

需要给出:函数名(参数值);
()起到了函数调用的重要作用,即使没有参数也需要();
有参数的则需要给出正确的数量和顺序:
这些值会被按照顺序依次用来初始化函数中的参数。

函数知道每一次是哪里调用它,会返回到正确的地方。

从函数中返回

return 停止函数的的执行,并送回一个值。
return;
return 返回值;
一个函数可出现多个return语句。(单一出口更好)

int a,b,c;
a = 5;
b = 6;
c = max(10,12);         //可以赋值给变量
c = max(a,b);
c = max(c,23);
c = max( max(c,a),5);    //可以再传给函数
printf("%d\n", max(a,b));
max(12,13);            //可以丢掉

没有返回值的函数用void,不能使用带值的return,可以没有return。调用的时候也不可以做返回值的赋值。

函数先后关系

C的编译器自上而下分析你的代码,函数得在其被调用前进行定义或声明。或是没定义声明时,编译器猜测,该函数的类型,如果后面发现后面的函数类型和它猜测的不符,就输出错误error。

可以先声明,后main,再定义函数。编译器会检查前后的函数类型、定义声明是否一致。

void sum(int begin,int end);//声明

int main()
{
    //用到sum(a,b)函数
}

void sum(int begin,int end)//定义
{
    int i,sum=0;
     for(i=begin;i<=end;i++){
         sum+=i;
     }
     printf("%d到%d的和是%d\n",begin,end,sum);
}

函数原型

——  函数头,以分号;结尾,就构成了函数的原型;
——  函数原型的目的时告诉编译器这个函数长什么样子:名称、参数(数量及类型)、返回类型。
——  在函数里定义的参数类型与输入的变量的类型不一样,会发生自动类型转换。
——  旧标准习惯将函数原型写在调用他的函数里面,现在一般卸载调用它的函数前
——  原型里可以不写参数的名字,但是一般仍然写上,便于人阅读。

Void sum(int ,int)

 参数传递

传递给函数的值可以是表达式的结果如(max(a,b),c)
包括字面量、变量、函数返回值(函数调用里有函数)、计算结果
当调用函数的值与参数类型不匹配:编译器总是悄悄替你把类型转换好,但是这很可能不是你所期望的。这是C语言传统上最大的漏洞。后续语言如c++/java在这方面会很严格。

void swap(int a,int b)//形参————>参数

int main()
{
   int a=5;
   b=6;
   swap(a,b);//实参————>值
}
void swap(int a,int b)//形参————>参数
{
    int t=a;
    a=b;
    b=t;
}

上面的代码期望交换ab的值,实际运行,调用swap处,它将main中的ab的值传给了swap的ab值,swap将swap中的ab进行了交换值,而main中的ab没有变化。

C语言在调用函数时,永远只能传递值给函数,函数中对变量做的处理和main中的变量无关。

每个函数又自己的变量空间,参数也位于这个独立空间中,和其他函数没有关系

过去对于函数参数表中的参数,叫做“形式参数”,调用函数时给的值,叫做“实际参数”。
现为了避免误会

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值