开网店需要自己做网站吗,wordpress添加dplayer,宁波正规优化seo软件,d开头的做网站的软件ʕ • ᴥ • ʔ づ♡ど #x1f389; 欢迎点赞支持#x1f389; 文章目录 前言 一、return语句 二、数组做函数参数 三、嵌套调用和链式访问 3.1 嵌套调用 3.2 链式访问 四、函数声明和定义 4.1 单个文件 4.2 多个文件 总结 前言 大家好啊#xff0c;继我们上一… ʕ • ᴥ • ʔ づ♡ど 欢迎点赞支持 文章目录 前言 一、return语句 二、数组做函数参数 三、嵌套调用和链式访问 3.1 嵌套调用 3.2 链式访问 四、函数声明和定义 4.1 单个文件 4.2 多个文件 总结 前言 大家好啊继我们上一次讲的函数1已经过了两周了不知道大家掌握的怎么样由于要期末考试我断更了两周希望大家见谅那么我们接着上一章节来继续说说函数的内容吧。我们这一章节就来看看return语句和数组传参及嵌套调用和链式访问等问题接下来我们来一起学习本次的内容。 一、return语句
我们在使用函数的过程中总是使用到return语句例如
int Add(int a, int b)
{int c a b;return c;
} 既然return这么重要那它到底怎么使用呢我们来了解了解。 1. return后面可以是一个数值也可以是一个表达式但是如果return后面是表达式的话要先计算表达式的内容在返回结果。 2. return后面可以什么都没有直接写return这种写法适合函数返回类型是void无类型返回的情况 3. return返回的值和函数返回的类型不一致系统会自动返回的值转换成函数返回的类型。 4. return执行后函数就彻底返回后面的代码不执行。 5. 如果函数中出现了if分支要确保每个分支都有返回的情况不然程序会报错。 我来一条一条的为大家解释。
首先是第一条我们可以从上节课的代码就能知道return可以直接返回数值也可以返回一个表达式。
int Add(int a, int b)
{int c a b;return c;
}
int Add(int a, int b)
{return a b;
}
表达式是先通过计算出结果后才返回最终的值的这很好理解就不多赘述。
其次是第2条也很好理解函数本身是不需要任何的返回类型的那return后面肯定什么也不能加的可能会有人疑问那这个return加在这个函数里面有什么用当然是有用的这个就可以和第4点结合起来它可以直接中断函数而不继续运行下面的代码。这就是这个return的作用。
void Print(int n)
{if (n 0){return;}for (int i 1; i n; i){printf(%d , i);}
}int main()
{int n 0;scanf(%d, n);Print(n);return 0;
}
我们可以来看这个代码这个代码的目的是如果n0就把1~n的数字打印出来我们可以来看这个打印的函数Print就可以看到如果n0就return我们可以来看看这个return后还会不会继续运行函数下面的代码了。 可以看到我输入一个正数它很好的打印出来了那我输入一个负数或者0会怎么样呢 很显然它什么都没有输出这就是return的强大它比break都强break是跳出循环而return是直接跳出函数。
我们现在来看看第3点其实也很好理解就是如果return返回的类型和函数要求的返回类型不一样是会转换成函数类型。
char test(char a)
{int b a;return b;
}int main()
{char a;scanf(%c, a);int b sizeof(test(a));printf(%d, b);return 0;
}
我们可以来看看这个代码我们先输入一个字符然后写一个函数这个函数的返回类型是字符型但是我却返回了一个整型那我们来看看它到底返回的是字符还是整型吧我们可以知道字符的sizeof是1而整型是大于等于2。 可以看到是1所以返回回来的是字符型。也就是函数要求的返回类型。
最后我们来看看第5点其实也很简单你想想如果一个要求要返回内容的函数却没有返回内容会怎么办肯定会出现问题啊可能你十分肯定不会有其他情况发生但是万一呢万一发生了呢可能你会想那再改嘛但是给了用户后发生这种情况导致程序崩溃了那是多大的损失啊。所以为了防止这种事情的发生函数中如果有if那必须都有返回值不然程序会报错的。 二、数组做函数参数
我们在使用函数的过程之中难免会使用到数组做参数就比如说我们如果想写一个函数让它把数组里的数据都变成0那就得把数组传参到函数中那我们接下来了解了解数组如何传参吧。
我们可以先来写两个关于数组传参的函数第一个就是把数组里的数据都变成0的函数第二个则是打印数组的函数。
int main()
{int arr[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };set_arr(); //把数组里的数据都变成0print_arr(); //打印数组的函数return 0;
}
我们可以先来想想如果我们要去让数组内的数据都变成0的话肯定还是要知道数组里的元素个数的而且我们之前传实参的时候都是在内输入要传过去的东西的名字的按道理来讲数组也是这样的我们之前说过数组的名是[ ]前的也就是arr所以说最后就变成了这样。
int main()
{int arr[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };int sz sizeof(arr) / sizeof(arr[0]); //求元素的个数set_arr(arr, sz); //把数组里的数据都变成0print_arr(arr, sz); //打印数组的函数return 0;
}
这就是实参的写法实参传输过去变成形参啦那形参该怎么写呢我们参考上一章节的内容就可以知道其实很简单唯一困难的地方就是不知道数组该用什么类型来表示。这里我们来复习一下我们前面讲数组是说数组是什么类型的啊除去我们命名的东东其他的就是它的类型比如我们这里的arr它的类型是int [ ]那我们的形参是不是 int [ ] arr呢答案肯定是否定的其实没有那么复杂直接就是数组啥样它啥样就行了数组是int arr[ ]那形参也是int arr[ ]当然如果你想换个名字比如说int brr[ ]也可以。所以说最终函数长这样。
void set_arr(int arr[], int sz)
{for (int i 0; i sz; i){arr[i] 0;}
}void print_arr(int arr[], int sz)
{for (int i 0; i sz; i){printf(%d , arr[i]);}
}int main()
{int arr[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };int sz sizeof(arr) / sizeof(arr[0]); //求元素的个数set_arr(arr, sz); //把数组里的数据都变成0print_arr(arr, sz); //打印数组的函数return 0;
} 这就是数组的传参方式当然不知这一种等我们学到指针时还有其他的办法会更实用一点。当然数组这里还有几个重要的知识点得掌握。
1. 函数的形式参数要和函数的实际参数相匹配。
也就是说实参传了两个参数过去那形参就一定要用两个参数接收不能多也不能少。
2. 函数的实参是数组形参也是可以写成数组的形式的。
3. 形参如果是一维数组那数组的大小可以省略不写。
也就和我上面的相同[ ]中没有数组的大小当然如果写了也无伤大雅。
4. 形参如果是二维数组行可以省略但是列不行就和创建二维数组相同。
5. 数组传参形参是不会创建新数组的。
也就是说实参的数组和形参的数组是一个数组而不是和上节课那样只是数据相同但不是同一个东西数组就是同一个数组。
6. 形参操作的数组和实参操作的数组是同一个数组。
同上面同理。 三、嵌套调用和链式访问 3.1 嵌套调用
嵌套调用就是函数之间相互调用就像孔明锁或者鲁班锁各种不同的结构相互平凑在一起形成了一个非常稳固的结构。而正是因为函数之间有效的相互调用才形成了相对的的程序。
假如我们要写一个程序要让它求出某年某月有多少天怎么做呢我们来看一下。
int main()
{int years 0;int month 0;scanf(%d %d, years, month);int day get_month_day(years, month); // 用来求某年某月有多少天的函数printf(%d, day);return 0;
}
这是主函数我们可以先创建一个函数来解决这个问题我们来分析一下这个问题其实很简单月份基本上是固定的唯一一个不固定的月份就是二月闰年二月29天平年二月28天所以问题就变成了一个找闰年的问题我们可以再创建一个函数来判断是不是闰年。
int is_leap_year(int y) //是闰年返回1不是返回0
{if (y % 4 0 y % 100 ! 0 || y % 400 0){return 1;}else{return 0;}
}
int get_month_day(int y, int m)
{int arr[13] { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };//由于arr的下标是从0开始的所以说我们可以空一位让下标0变成0if (is_leap_year(y) 1 m 2){return arr[m] 1;}else{return arr[m];}
}int main()
{int years 0;int month 0;scanf(%d %d, years, month);int day get_month_day(years, month); // 用来求某年某月有多少天的函数printf(%d, day);return 0;
}
我们可以得到以上的函数这就能很好的满足我们的要求这就是嵌套调用。 当然还可以用switch大家可以去试一试这里就不带大家尝试了。
大家要注意函数不能嵌套定义就是说在一个函数中在定义一个函数是万分不可的。 3.2 链式访问
链式访问就是值把一个函数的返回值作为一个函数的参数像链条一样将函数串起来就是链式访问。
就比如我们之前玩过的strlen函数它的作用是求字符串长度
int main()
{int a strlen(ABCDEFG);printf(%d\n, a);return 0;
}
这个代码很容易懂就是求出ABCDEFG的大小后存储在a中然后再用printf函数输出出来。 可能有人就在想了能不能直接把strlen写在printf里面不用a保存比如
int main()
{printf(%d\n, strlen(ABCDEFG));return 0;
}
当然可以这就是一个链式访问将strlen函数的返回值放在printf的参数之中。 四、函数声明和定义 4.1 单个文件
我们在创建函数的时候一般都是把函数写在主程序的前面例如
int Add(int a, int b) //函数的定义
{return a b;
}int main()
{int a 0;int b 0;scanf(%d %d, a, b);int c Add(a, b);//函数的调用printf(%d, c);return 0;
}
我们把上面的函数叫做函数的定义而下面引用函数的地方叫做函数的调用。但是我们其实也可以把函数写在主函数的下面。
int main()
{int a 0;int b 0;scanf(%d %d, a, b);int c Add(a, b);//函数的调用printf(%d, c);return 0;
}int Add(int a, int b) //函数的定义
{return a b;
}
这个时候我们运行代码会发现程序报错了。 上面显示说是Add未定义原因是因为编译器在从上往下编译时发现主程序中有Add这个函数但是它在前面没有看见过所以就显示未定义这个时候我们就可以声明一下。
int Add(int a, int b);//函数的声明int main()
{int a 0;int b 0;scanf(%d %d, a, b);int c Add(a, b);//函数的调用printf(%d, c);return 0;
}int Add(int a, int b) //函数的定义
{return a b;
}
这就是函数的声明这样程序就能正常运行了当然函数的定义是特殊的函数声明。 4.2 多个文件
其实我们一般在创建函数是都不会在一个文件中创建一般会分为两个文件 .h头文件 ---- 函数的声明 .c源文件 ---- 函数的定义 以上就是我们声明函数的地方。 以上就是我们函数定义的地方。
我们在头文件中声明函数在源文件中定义函数最后再在我们的主文件中使用函数这就是多个文件的函数声明和定义。
声明 定义 使用 在使用时要注意要引用我们自己创建的头文件我们自己的头文件用 来引用。 总结
以上就是函数的内容啦希望大家好好吸收和理解下一章节我来说说操作符吧。感谢大家的观看如果哪里有误欢迎支持谢谢大家。 文章转载自: http://www.morning.xhfky.cn.gov.cn.xhfky.cn http://www.morning.pttrs.cn.gov.cn.pttrs.cn http://www.morning.wjtxt.cn.gov.cn.wjtxt.cn http://www.morning.clpkp.cn.gov.cn.clpkp.cn http://www.morning.lbpfl.cn.gov.cn.lbpfl.cn http://www.morning.xqjh.cn.gov.cn.xqjh.cn http://www.morning.zmqb.cn.gov.cn.zmqb.cn http://www.morning.rhkq.cn.gov.cn.rhkq.cn http://www.morning.shawls.com.cn.gov.cn.shawls.com.cn http://www.morning.wtdyq.cn.gov.cn.wtdyq.cn http://www.morning.mrxqd.cn.gov.cn.mrxqd.cn http://www.morning.lzph.cn.gov.cn.lzph.cn http://www.morning.nkpml.cn.gov.cn.nkpml.cn http://www.morning.lzbut.cn.gov.cn.lzbut.cn http://www.morning.mtbsd.cn.gov.cn.mtbsd.cn http://www.morning.jtqxs.cn.gov.cn.jtqxs.cn http://www.morning.pgkpt.cn.gov.cn.pgkpt.cn http://www.morning.hpprx.cn.gov.cn.hpprx.cn http://www.morning.ckrnq.cn.gov.cn.ckrnq.cn http://www.morning.kycwt.cn.gov.cn.kycwt.cn http://www.morning.vehna.com.gov.cn.vehna.com http://www.morning.xgjhy.cn.gov.cn.xgjhy.cn http://www.morning.qbzdj.cn.gov.cn.qbzdj.cn http://www.morning.tbcfj.cn.gov.cn.tbcfj.cn http://www.morning.yfddl.cn.gov.cn.yfddl.cn http://www.morning.nhrkc.cn.gov.cn.nhrkc.cn http://www.morning.bpncd.cn.gov.cn.bpncd.cn http://www.morning.ghzfx.cn.gov.cn.ghzfx.cn http://www.morning.rwzkp.cn.gov.cn.rwzkp.cn http://www.morning.knzmb.cn.gov.cn.knzmb.cn http://www.morning.yqsq.cn.gov.cn.yqsq.cn http://www.morning.kpcjl.cn.gov.cn.kpcjl.cn http://www.morning.yhpq.cn.gov.cn.yhpq.cn http://www.morning.hsdhr.cn.gov.cn.hsdhr.cn http://www.morning.lqznq.cn.gov.cn.lqznq.cn http://www.morning.ssgqc.cn.gov.cn.ssgqc.cn http://www.morning.lgkbn.cn.gov.cn.lgkbn.cn http://www.morning.bpncd.cn.gov.cn.bpncd.cn http://www.morning.gkgr.cn.gov.cn.gkgr.cn http://www.morning.fcxt.cn.gov.cn.fcxt.cn http://www.morning.rhwty.cn.gov.cn.rhwty.cn http://www.morning.wsgyq.cn.gov.cn.wsgyq.cn http://www.morning.nrqtk.cn.gov.cn.nrqtk.cn http://www.morning.yfnjk.cn.gov.cn.yfnjk.cn http://www.morning.wztnh.cn.gov.cn.wztnh.cn http://www.morning.ntwfr.cn.gov.cn.ntwfr.cn http://www.morning.skwwj.cn.gov.cn.skwwj.cn http://www.morning.jtmrx.cn.gov.cn.jtmrx.cn http://www.morning.trnhy.cn.gov.cn.trnhy.cn http://www.morning.sthp.cn.gov.cn.sthp.cn http://www.morning.kzrbn.cn.gov.cn.kzrbn.cn http://www.morning.yppln.cn.gov.cn.yppln.cn http://www.morning.wrtbx.cn.gov.cn.wrtbx.cn http://www.morning.kpgft.cn.gov.cn.kpgft.cn http://www.morning.qnlbb.cn.gov.cn.qnlbb.cn http://www.morning.bdfph.cn.gov.cn.bdfph.cn http://www.morning.nyqm.cn.gov.cn.nyqm.cn http://www.morning.qjghx.cn.gov.cn.qjghx.cn http://www.morning.lgtzd.cn.gov.cn.lgtzd.cn http://www.morning.sgfgz.cn.gov.cn.sgfgz.cn http://www.morning.kdlzz.cn.gov.cn.kdlzz.cn http://www.morning.qlbmc.cn.gov.cn.qlbmc.cn http://www.morning.rttp.cn.gov.cn.rttp.cn http://www.morning.mxhgy.cn.gov.cn.mxhgy.cn http://www.morning.hjjfp.cn.gov.cn.hjjfp.cn http://www.morning.lpgw.cn.gov.cn.lpgw.cn http://www.morning.ntqlz.cn.gov.cn.ntqlz.cn http://www.morning.dhmll.cn.gov.cn.dhmll.cn http://www.morning.drzkk.cn.gov.cn.drzkk.cn http://www.morning.pdtjj.cn.gov.cn.pdtjj.cn http://www.morning.ydnx.cn.gov.cn.ydnx.cn http://www.morning.dlmqn.cn.gov.cn.dlmqn.cn http://www.morning.qwdqq.cn.gov.cn.qwdqq.cn http://www.morning.ssfq.cn.gov.cn.ssfq.cn http://www.morning.jghty.cn.gov.cn.jghty.cn http://www.morning.gqjqf.cn.gov.cn.gqjqf.cn http://www.morning.pnljy.cn.gov.cn.pnljy.cn http://www.morning.tgnr.cn.gov.cn.tgnr.cn http://www.morning.rfrxt.cn.gov.cn.rfrxt.cn http://www.morning.ltpph.cn.gov.cn.ltpph.cn