当前位置: 首页 > news >正文

htm网站模板中国建设报网站

htm网站模板,中国建设报网站,网站做几个域名比较好,深度网络1. 函数的概念 数学中我们其实就⻅过函数的概念#xff0c;⽐如#xff1a;⼀次函数 y kx b #xff0c;k和b都是常数#xff0c;给⼀个任意的 x#xff0c;就得到⼀个y值。其实在C语⾔也引⼊函数#xff08;function#xff09;的概念#xff0c;有些翻译为#xf…1. 函数的概念 数学中我们其实就⻅过函数的概念⽐如⼀次函数 y kx b k和b都是常数给⼀个任意的 x就得到⼀个y值。其实在C语⾔也引⼊函数function的概念有些翻译为⼦程序⼦程序这种翻译更加准确⼀些。 C语⾔中的函数就是⼀个完成某项特定的任务的⼀⼩段代码。这段代码是有特殊的写法和调⽤⽅法的。 C语⾔的程序其实是由⽆数个⼩的函数组合⽽成的也可以说⼀个⼤的计算任务可以分解成若⼲个较 ⼩的函数对应较⼩的任务完成。同时⼀个函数如果能完成某项特定任务的话这个函数也是可以 复⽤的提升了开发软件的效率。 在C语⾔中我们⼀般会⻅到两类函数 • 库函数 • ⾃定义函数 2. 库函数 2.1 标准库和头⽂件 C语⾔标准中规定了C语⾔的各种语法规则C语⾔并不提供库函数C语⾔的国际标准ANSIC规定了⼀ 些常⽤的函数的标准被称为标准库那不同的编译器⼚商根据ANSI提供的C语⾔标准就给出了⼀系列 函数的实现。这些函数就被称为库函数。 我们前⾯内容中学到的 printf 、 scanf 都是库函数库函数也是函数不过这些函数已经是现成 的我们只要学会就能直接使⽤了。有了库函数⼀些常⻅的功能就不需要程序员⾃⼰实现了⼀定 程度提升了效率同时库函数的质量和执⾏效率上都更有保证。 各种编译器的标准库中提供了⼀系列的库函数这些库函数根据功能的划分都在不同的头⽂件中进 ⾏了声明。 库函数相关头⽂件https://zh.cppreference.com/w/c/header有数学相关的有字符串相关的有⽇期相关的等每⼀个头⽂件中都包含了相关的函数和类型等 信息库函数的学习不⽤着急⼀次性全部学会慢慢学习各个击破就⾏。 2.2 库函数的使⽤⽅法 库函数的学习和查看⼯具很多 ⽐如 C/C官⽅的链接https://zh.cppreference.com/w/c/header  cplusplus.comC library - C Reference 举例sqrt 2.2.1 功能 Compute square root计算平⽅根 Returns the square root of x.返回平⽅根 2.2.2 头⽂件包含 库函数是在标准库中对应的头⽂件中声明的所以库函数的使⽤务必包含对应的头⽂件不包含是 可能会出现⼀些问题的。 2.2.3 实践 #include stdio.h #include math.h int main() {double d 16.0;double r sqrt(d);printf(%lf\n, r);return 0; }2.2.4 库函数⽂档的⼀般格式 1. 函数原型 2. 函数功能介绍 3. 参数和返回类型说明 4. 代码举例 5. 代码输出 6. 相关知识链接 3. ⾃定义函数 了解了库函数我们的关注度应该聚焦在⾃定义函数上⾃定义函数其实更加重要也能给程序员写 代码更多的创造性。 3.1 函数的语法形式 其实⾃定义函数和库函数是⼀样的形式如下 ret_type fun_name(形式参数) { }• ret_type 是函数返回类型  • fun_name 是函数名 • 括号中放的是形式参数 • {}括起来的是函数体 我们可以把函数想象成⼩型的⼀个加⼯⼚⼯⼚得输⼊原材料经过⼯⼚加⼯才能⽣产出产品那函 数也是⼀样的函数⼀般会输⼊⼀些值可以是0个也可以是多个经过函数内的计算得出结 果。 • ret_type 是⽤来表⽰函数计算结果的类型有时候返回类型可以是 void 表⽰什么都不返回 • fun_name 是为了⽅便使⽤函数就像⼈的名字⼀样有了名字⽅便称呼函数有了名字⽅便调 ⽤所以函数名尽量要根据函数的功能起的有意义。 • 函数的参数就相当于⼯⼚中送进去的原材料函数的参数也可以是 void 明确表⽰函数没有参数。如果有参数要交代清楚参数的类型和名字以及参数个数。 • {}括起来的部分被称为函数体函数体就是完成计算的过程。 3.2 函数的举例 举个例⼦ 写⼀个加法函数完成2个整型变量的加法操作。 #include stdio.hint main() {int a 0;int b 0;//输⼊ scanf(%d %d, a, b);//调⽤加法函数完成a和b的相加 //求和的结果放在r中 //to do//输出 printf(%d\n, r);return 0; }我们根据要完成的功能给函数取名Add函数Add需要接收2个整型类型的参数函数计算的结果 也是整型。 所以我们根据上述的分析写出函数 #include stdio.h int Add(int x, int y) {int z 0;z xy;return z; } int main() {int a 0;int b 0;//输⼊ scanf(%d %d, a, b);//调⽤加法函数完成a和b的相加 //求和的结果放在r中 int r Add(a, b);//输出 printf(%d\n, r);return 0; }Add函数也可以简化为 int Add(int x, int y) {return xy; }函数的参数部分需要交代清楚参数个数每个参数的类型是啥形参的名字叫啥。 上⾯只是⼀个例⼦未来我们是根据实际需要来设计函数函数名、参数、返回类型都是可以灵活变 化的。 4. 形参和实参 在函数使⽤的过程中把函数的参数分为实参和形参。 再看看我们前⾯写的代码 #include stdio.h int Add(int x, int y) {int z 0;z xy;return z; } int main() {int a 0;int b 0;//输⼊ scanf(%d %d, a, b);//调⽤加法函数完成a和b的相加 //求和的结果放在r中 int r Add(a, b);//输出 printf(%d\n, r);return 0; }4.1 实参 在上⾯代码中第2~7⾏是 Add 函数的定义有了函数后再第17⾏调⽤Add函数的。 我们把第17⾏调⽤Add函数时传递给函数的参数a和b称为实际参数简称实参。 实际参数就是真实传递给函数的参数。 4.2 形参 在上⾯代码中第2⾏定义函数的时候在函数名 Add 后的括号中写的 x 和 y 称为形式参数简 称形参。 为什么叫形式参数呢实际上如果只是定义了 Add 函数⽽不去调⽤的话 Add 函数的参数 x 和 y 只是形式上存在的不会向内存申请空间不会真实存在的所以叫形式参数。形式参数只有在 函数被调⽤的过程中为了存放实参传递过来的值才向内存申请空间这个过程就是形参的实例化。 4.3 实参和形参的关系 虽然我们提到了实参是传递给形参的他们之间是有联系的但是形参和实参各⾃是独⽴的内存空 间。 这个现象是可以通过调试来观察的。请看下⾯的代码和调试演⽰: #include stdio.h int Add(int x, int y) {int z 0;z x y;return z; } int main() {int a 0;int b 0;//输⼊ scanf(%d %d, a, b);//调⽤加法函数完成a和b的相加 //求和的结果放在r中 int r Add(a, b);//输出 printf(%d\n, r);return 0; }我们在调试的时候可以观察到x和y确实得到了a和b的值但是x和y的地址和a和b的地址是不⼀样 的所以我们可以理解为形参是实参的⼀份临时拷⻉。 5. return语句 在函数的设计中函数中经常会出现return语句这⾥讲⼀下return语句使⽤的注意事项。  • return后边可以是⼀个数值也可以是⼀个表达式如果是表达式则先执⾏表达式再返回表达式 的结果。 • return后边也可以什么都没有直接写 return; 这种写法适合函数返回类型是void的情况。 • return语句执⾏后函数就彻底返回后边的代码不再执⾏。 • return返回的值和函数返回类型不⼀致系统会⾃动将返回的值隐式转换为函数的返回类型。 • 如果函数中存在if等分⽀的语句则要保证每种情况下都有return返回否则会出现编译错误。 • 函数的返回类型如果不写编译器会默认函数的返回类型是int。 • 函数写了返回类型但是函数中没有使⽤return返回值那么函数的返回值是未知的。 6. 数组做函数参数 在使⽤函数解决问题的时候难免会将数组作为参数传递给函数在函数内部对数组进⾏操作。 ⽐如写⼀个函数将⼀个整型数组的内容全部置为-1再写⼀个函数打印数组的内容。 简单思考⼀下基本的形式应该是这样的 #include stdio.h 2int main() {int arr[] {1,2,3,4,5,6,7,8,9,10};set_arr();//设置数组内容为-1 print_arr();//打印数组内容 return 0; }这⾥的set_arr函数要能够对数组内容进⾏设置就得把数组作为参数传递给函数同时函数内部在设 置数组每个元素的时候也得遍历数组需要知道数组的元素个数。所以我们需要给set_arr传递2个参 数⼀个是数组另外⼀个是数组的元素个数。仔细分析print_arr也是⼀样的只有拿到了数组和元 素个数才能遍历打印数组的每个元素。 #include stdio.h 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);//设置数组内容为-1 print_arr(arr, sz);//打印数组内容 return 0; } 数组作为参数传递给了set_arr和print_arr函数了那这两个函数应该如何设计呢这⾥我们需要知道数组传参的⼏个重点知识 • 函数的形式参数要和函数的实参个数匹配 • 函数的实参是数组形参也是可以写成数组形式的 • 形参如果是⼀维数组数组⼤⼩可以省略不写 • 形参如果是⼆维数组⾏可以省略但是列不能省略 • 数组传参形参是不会创建新的数组的 • 形参操作的数组和实参的数组是同⼀个数组 根据上述的信息我们就可以实现这两个函数 void set_arr(int arr[], int sz) {int i 0; 1 2 3 #include stdio.h 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);//设置数组内容为-1 print_arr(arr, sz);//打印数组内容 return 0; } for(i0; isz; i){arr[i] -1;} } void print_arr(int arr[], int sz) {int i 0;for(i0; isz; i){printf(%d , arr[i]);}printf(\n); }7. 嵌套调⽤和链式访问 7.1 嵌套调⽤ 嵌套调⽤就是函数之间的互相调⽤每个函数就像⼀个乐⾼零件正是因为多个乐⾼的零件互相⽆缝 的配合才能搭建出精美的乐⾼玩具也正是因为函数之间有效的互相调⽤最后写出来了相对⼤型的 程序。 假设我们计算某年某⽉有多少天如果要函数实现可以设计2个函数: • is_leap_year()根据年份确定是否是闰年 • get_days_of_month()调⽤is_leap_year确定是否是闰年后再根据⽉计算这个⽉的天数 int is_leap_year(int y) {if(((y%40)(y%100!0))||(y%4000))return 1;elsereturn 0; } int get_days_of_month(int y, int m) {int days[] {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};int day days[m];if (is_leap_year(y) m 2)day 1; return day; } int main() {int y 0;int m 0;scanf(%d %d, y, m);int d get_days_of_month(y, m);printf(%d\n, d);return 0; }这⼀段代码完成了⼀个独⽴的功能。代码中反应了不少的函数调⽤ • main 函数调⽤ scanf 、 printf 、 get_days_of_month • get_days_of_month 函数调⽤ is_leap_year 未来的稍微⼤⼀些代码都是函数之间的嵌套调⽤但是函数是不能嵌套定义的。 7.2 链式访问 所谓链式访问就是将⼀个函数的返回值作为另外⼀个函数的参数像链条⼀样将函数串起来就是函数 的链式访问。 include stdio.h int main() {int len strlen(abcdef);//1.strlen求⼀个字符串的⻓度 printf(%d\n, len);//2.打印⻓度 return 0; }在看⼀个有趣的代码下⾯代码执⾏的结果是什么呢 #include stdio.h int main() {printf(%d, printf(%d, printf(%d, 43)));return 0; }这个代码的关键是明⽩printf函数的返回是啥 int printf ( const char * format, ... );printf函数返回的是打印在屏幕上的字符的个数。上⾯的例⼦中我们就第⼀个printf打印的是第⼆个printf的返回值第⼆个printf打印的是第三个 printf的返回值。第三个printf打印43在屏幕上打印2个字符再返回2 第⼆个printf打印2在屏幕上打印1个字符再返回第 ⼀个printf打印1 所以屏幕上最终打印4321 8. 函数的声明和定义 8.1 单个⽂件 ⼀般我们在使⽤函数的时候直接将函数写出来就使⽤了。 ⽐如我们要写⼀个函数判断⼀年是否是闰年。 #include stido.h //判断⼀年是不是闰年 int is_leap_year(int y) {if(((y%40)(y%100!0)) || (y%4000))return 1;elsereturn 0; } int main() {int y 0;scanf(%d, y);int r is_leap_year(y);if(r 1)printf(闰年\n);elseprintf(⾮闰年\n);return 0; }那如果我们将函数的定义放在函数的调⽤后边如下 #include stido.h int main() {int y 0;scanf(%d, y);int r is_leap_year(y);if(r 1)printf(闰年\n);elseprintf(⾮闰年\n); return 0; } //判断⼀年是不是闰年 int is_leap_year(int y) {if(((y%40)(y%100!0)) || (y%4000))return 1;elsereturn 0; }这是因为C语⾔编译器对源代码进⾏编译的时候从第⼀⾏往下扫描的当遇到第7⾏的is_leap_year 函数调⽤的时候并没有发现前⾯有is_leap_year的定义就报出了上述的警告。 把怎么解决这个问题呢就是函数调⽤之前先声明⼀下is_leap_year这个函数声明函数只要交代清 楚函数名函数的返回类型和函数的参数。 如intis_leap_year(inty)这就是函数声明函数声明中参数只保留类型省略掉名字也是可以 的。 代码变成这样就能正常编译了。 这是因为C语⾔编译器对源代码进⾏编译的时候从第⼀⾏往下扫描的当遇到第7⾏的is_leap_year 函数调⽤的时候并没有发现前⾯有is_leap_year的定义就报出了上述的警告。 把怎么解决这个问题呢就是函数调⽤之前先声明⼀下is_leap_year这个函数声明函数只要交代清 楚函数名函数的返回类型和函数的参数。 如int is_leap_year(int y)这就是函数声明函数声明中参数只保留类型省略掉名字也是可以 的。 代码变成这样就能正常编译了。 #include stido.h int is_leap_year(int y)//函数声明 int main() {int y 0;scanf(%d, y);int r is_leap_year(y);if(r 1)printf(闰年\n);elseprintf(⾮闰年\n);return 0; } //判断⼀年是不是闰年 int is_leap_year(int y) {if(((y%40)(y%100!0)) || (y%4000))return 1;elsereturn 0; }函数的调⽤⼀定要满⾜先声明后使⽤ 函数的定义也是⼀种特殊的声明所以如果函数定义放在调⽤之前也是可以的。 8.2 多个⽂件 ⼀般在企业中我们写代码时候代码可能⽐较多不会将所有的代码都放在⼀个⽂件中我们往往会 根据程序的功能将代码拆分放在多个⽂件中。 ⼀般情况下函数的声明、类型的声明放在头⽂件.h中函数的实现是放在源⽂件.c⽂件中。 如下 add.c //函数的定义 int Add(int x, int y) {return xy; }add.h //函数的声明 int Add(int x, int y);test.c #include stdio.h #include add.h 1 2int main() {int a 10;int b 20;//函数调⽤ int c Add(a, b);printf(%d\n, c);return 0; }有了函数声明和函数定义的理解我们写代码就更加⽅便了。 8.3 static和extern static 和extern 都是C语⾔中的关键字。static 是 静态的 的意思可以⽤来 • 修饰局部变量 • 修饰全局变量 • 修饰函数extern 是⽤来声明外部符号的。 在讲解 static 和 extern 之前再讲⼀下作⽤域和⽣命周期。 作⽤域scope是程序设计概念通常来说⼀段程序代码中所⽤到的名字并不总是有效可⽤ 的⽽限定这个名字的可⽤性的代码范围就是这个名字的作⽤域。 1. 局部变量的作⽤域是变量所在的局部范围。 2. 全局变量的作⽤域是整个⼯程项⽬。 ⽣命周期指的是变量的创建(申请内存)到变量的销毁(收回内存)之间的⼀个时间段。 1. 局部变量的⽣命周期是进⼊作⽤域变量创建⽣命周期开始出作⽤域⽣命周期结束。 2. 全局变量的⽣命周期是整个程序的⽣命周期。 8.3.1 static修饰局部变量 //代码1 #include stdio.h void test() {int i 0;i;printf(%d , i); } int main() {int i 0;for(i0; i5; i){test();}return 0; }//代码2 #include stdio.h void test() {//static修饰局部变量 static int i 0;i;printf(%d , i); } int main() {int i 0;for(i0; i5; i){test();}return 0; }对⽐代码1和代码2的效果理解 static 修饰局部变量的意义。 代码1的test函数中的局部变量i是每次进⼊test函数先创建变量⽣命周期开始并赋值为0然后 再打印出函数的时候变量⽣命周期将要结束释放内存。代码2中我们从输出结果来看i的值有累加的效果其实test函数中的i创建好后出函数的时候是 不会销毁的重新进⼊函数也就不会重新创建变量直接上次累积的数值继续计算。 结论static修饰局部变量改变了变量的⽣命周期⽣命周期改变的本质是改变了变量的存储类型本 来⼀个局部变量是存储在内存的栈区的但是被 static 修饰后存储到了静态区。存储在静态区的变 量和全局变量是⼀样的⽣命周期就和程序的⽣命周期⼀样了只有程序结束变量才销毁内存才 回收。但是作⽤域不变的。 使⽤建议未来⼀个变量出了函数后我们还想保留值等下次进⼊函数继续使⽤就可以使⽤static 修饰。 8.3.2 static修饰全局变量 extern是⽤来声明外部符号的如果⼀个全局的符号在A⽂件中定义的在B⽂件中想使⽤就可以使 ⽤ extern 进⾏声明然后使⽤。 代码1正常代码2在编译的时候会出现链接性错误。结论 ⼀个全局变量被static修饰使得这个全局变量只能在本源⽂件内使⽤不能在其他源⽂件内使⽤。 本质原因是全局变量默认是具有外部链接属性的在外部的⽂件中想使⽤只要适当的声明就可以使 ⽤但是全局变量被 static 修饰之后外部链接属性就变成了内部链接属性只能在⾃⼰所在的源 ⽂件内部使⽤了其他源⽂件即使声明了也是⽆法正常使⽤的。 使⽤建议如果⼀个全局变量只想在所在的源⽂件内部使⽤不想被其他⽂件发现就可以使⽤ static修饰。 8.3.3 static修饰函数 代码1是能够正常运⾏的但是代码2就出现了链接错误。 其实 static 修饰函数和 static 修饰全局变量是⼀模⼀样的⼀个函数在整个⼯程都可以使⽤ 被static修饰后只能在本⽂件内部使⽤其他⽂件⽆法正常的链接使⽤了。 本质是因为函数默认是具有外部链接属性具有外部链接属性使得函数在整个⼯程中只要适当的声 明就可以被使⽤。但是被 static 修饰后变成了内部链接属性使得函数只能在⾃⼰所在源⽂件内部 使⽤。 使⽤建议⼀个函数只想在所在的源⽂件内部使⽤不想被其他源⽂件使⽤就可以使⽤ static 修 饰。
http://www.w-s-a.com/news/699766/

相关文章:

  • 选服务好的网站建设亚洲砖码砖专区2022
  • 网站快速查找wordpress 悬停 图片 文字
  • 网站续费 多久想自己做网站该学些什么
  • 可以自己做网站wordpress英文写作插件
  • 国外可以做会员网站的网站怎么查百度竞价关键词价格
  • 新站网站建设亚马逊关键词
  • 电商网站前端架构设计上海市建设工程安全生产协会网站
  • 东莞企业免费模版网站建设一般网站维护要多久
  • 著名建筑设计网站常州制作网站价格
  • 食品营销型网站广东省广州市白云区
  • 如何做网站哪个站推广描述对于营销型网站建设很重要飘红效果更佳
  • 济阳做网站公司99企业邮箱888
  • 国贸做网站的公司能接做网站的活的网站
  • 淮南建设厅网站上杭县建设局网站
  • 东莞做网站公司首选!西安注册公司费用
  • 做网站包括什么卖水果网站模板
  • 扬州网站建设外包wordpress 文章评分
  • 网站建设网站多少钱公司名字大全列表
  • 设计企业网站内容wordpress 投稿者 权限
  • seo网站推广免费价格低的成语
  • 做网站建设销售辛苦吗专题页是什么
  • 做网站的软件名字全拼wordpress可以上传文件吗
  • 建品牌网站公司关于asp_sql网站开发的书籍
  • 建网站公司营销型网站建设wordpress自定义登录页
  • 泉州市住房和城乡建设局网站淘宝店网站怎么做
  • 企业网站建设费未付款怎样挂账长春网站制作专业
  • 深圳找网站建设邹城市建设局网站
  • 长春火车站停运了吗网站开发概要设计
  • 网站开发表格整体页面居中网站域名详解
  • 漕泾网站建设赢展网站建设