函数
- 经过三个星期的慕课的学习大致上学会了C的一些基本知识,在经过三个星期的C语言课本实践将书上的例题,课后练习实践挨个做了一遍,终于到了函数这一章。时间过的好快呀。
- 函数分为库函数和自定义函数;有返回值(
- 和没有返回值
- 变量有实参(全局变量)形参(局部变量)
函数设计
- 一般某种功能使用超过三次以上,考虑将其写成函数
- 函数的设计要遵循“信息隐藏”的指导思想即把函数有关的代码和数据对程序的其他部分隐藏起来。
基本原则
- 函数规模要小,尽量控制在50行代码以内,这样的函数比代码更长的函数更容易维护,出错几率更小。
- 函数功能要单一,不要设计有多种用途的函数
- 每个函数只有一个入口和一个出口,尽量不要使用全局变量向函数传递参数。
- 函数接口中要清楚的定义函数的行为,包括入口参数,出口参数,返回状态,异常处理等;让调用者清楚函数所能进行的操作及操作是否操作成功,应尽可能的多考虑一些可能出错的情况,定义好接口后不要轻易改动。
- 在函数入口处对参数的有效性进行检查。
- 在执行某些敏感性操作时(如除法,开方,取对数,赋值,函数参数传递等)尽可能多考虑一些出错情况,定义好函数接口后轻易不要改动。
- 不能认为调用一个函数总会成功,要考虑到一个函数调用失败后该如何处理。
- 对于与屏幕显示无关的函数,通常需要通过返回值来报告错误,因此调用函数时要检验函数的返回值,以判断函数是否调用成功;对于与屏幕显示有关的函数,函数要负责相应的错误处理。错误代码一般放在函数末尾,对于某些错误还要设计专门的错误处理函数。
- 由于并非所有的编译器都能捕获实参与形参不匹配的错误,所以程序设计人员在函数调用时应确保实参类型与形参类型相匹配,在程序开头进行函数原型声明,并将函数参数的类型书写完整(没有参数时用void声明)有助于编译器进行匹配检查
- 当函数需要返回值时,应确保函数所有分支都有返回值,函数没有返回值时用void声明
为了更深刻理解函数的返回值问题,今天写练习的时候,特意写了下面这个代码
#include <stdio.h>
#include <stdlib.h>
int pd_Ss(int n)
{
int i;
for(i=1;i<n;i++)
{
if(n%i==0)
{
return i;
}
}
}
int main()
{
int m,result;
scanf("%d",&m);
result=pd_Ss(m);
printf("因子有%d",result);
}
- 事实证明函数的返回值只能有一个!
三目运算符
- 在做数组这一章练习这一章练习题目的时候,我使用的是
int Average(int score[],int n)
{
int i;
int sum=0;
for(i=0;i<n;i++)
{
sum+=score[i];
}
if(n>0) return sum/n;
else return -1;
}
- 书上参考代码
int Average(int score[],int n)
{
int i;
int sum=0;
for(i=0;i<n;i++)
{
sum+=score[i];
}
return n>0?sum/n:-1;
}
-发现了三目运算符这个好东西,在网上寻找答案。找到一个比较好理解的解释:"(a<b)?a:b"是一个"条件表达式",它是这样执行的:如果a<b为真,则表达式取a值,否则取b值.
这相当于一个判断语句。
感想
- 在这段时间的踏踏实实敲代码中,明确感受到了自己的不足和自己的进步,我并不喜欢抄书上的内容,但是这一部分有几点都是我容易错误的,感觉是一个非常重要的部分需要记录下来,在电脑上再敲一遍有助于理解和记忆,所以我将《C语言程序设计》(第三版)中的这一部分抄写下来。