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

青海网站建设系统wordpress 知呼

青海网站建设系统,wordpress 知呼,承德网站开发公司,帝国织梦wordpressC语⾔中的函数也被称做子程序#xff0c;意思就是⼀个完成某项特定的任务的⼀小段代码。 C语⾔标准中提供了许多库函数#xff0c;点击下面的链接可以查看c语言的库函数和头文件。 C/C官⽅的链接#xff1a;https://zh.cppreference.com/w/c/header 目录 一、函数头与函…C语⾔中的函数也被称做子程序意思就是⼀个完成某项特定的任务的⼀小段代码。 C语⾔标准中提供了许多库函数点击下面的链接可以查看c语言的库函数和头文件。 C/C官⽅的链接https://zh.cppreference.com/w/c/header 目录 一、函数头与函数体 二、实参与形参 三、return的用法事宜 四、main的返回类型与参数了解即可 #1. main的返回类型 #2. main的参数个数 #3. 参数argc和argv了解即可 五、数组作为函数参数重中之重 #1. 数组传参的本质 #2. 不存在形式数组(下标操作符失效) #3. 二维数组传参不能省略列 六、嵌套调用与链式访问 七、函数的声明与定义 #1. 声明与定义的区别 和 注意事项 #2. 未声明的函数  #3. 头文件声明的底层逻辑 和 函数调用操作符() 一、函数头与函数体 函数头 即函数定义中的第一行代码函数头内包含着(1)函数的返回类型、(2)函数的名字、(3)形式参数的类型和个数即参数表。 函数体 即函数定义中的大括号{ }部分它是是真正调用形参、执行子代码、返回任务值的重要部分。 举例执行加法运算的函数 int  add(int  a, int b)   //该行就是函数头(信息:函数名add返回类型int2个形参都是整型) {                                        // (int a, int b) 是参数表 return  ab;    //整个大括号的内容就是函数体(这里负责加法运算和返回运算的结果) } 二、实参与形参 实参的几种理解和概念 1. main函数中的参数包括常数和变量等 2. 实参是在调用函数时传递给函数的具体参数值。 3. 实参变量在主函数被创建时会直接申请内存空间程序结束时才归还内存空间。 实参的特点 1. 作用域可以在mian函数内使用不能在函数(子程序)被使用。 2. 生命周期从变量创建到程序结束。长时仅一次 形参的几种理解和概念 1. 形参是函数定义中的参数是一种占位符用于接收传递给函数的数据。 2. 形参是实参在函数调用时的⼀份临时拷贝。 3. 函数不被调用时形参变量不会申请内存空间调用时才申请空间调用完就归还空间。 形参的特点 1. 作用域可以在函数(子程序)使用不能在mian函数内被使用。 2. 生命周期从函数调用到函数结束。短时可多次 总的来说形参由实参而来它们的讨论载体是函数传递。 注意在函数中创建的变量并不属于形参变量而是局部变量因为它的创建并没有传递关系。 三、return的用法事宜 作用return后边可以是⼀个数值也可以是⼀个表达式如果是表达式则先执⾏表达式。return语句执⾏后函数就彻底返回(有返回值的话带回返回值)后边的代码不再执行。主函数也是如此 return在下面4种情况的用法细则 i. 函数返回值是void 因为无需返回类型可以写成“ return ; ”。return后面除了英文分号其他什么都不要写。 ii. 函数返回值类型与return的值不同 return返回的值和函数返回类型不⼀致系统会⾃动将返回的值隐式转换为函数的返回类型。 比如函数的返回类型是整型而return的任务值它的数据类型是浮点型那么返回的结果是在任务值的基础上去掉小数部分留下整数部分 int f() {return 1.5 3.7; } int main() {int a f();printf(返回值为%d\n, a);return 0; } 1.5 3.7等于5.2但是返回类型是int所以被隐式类型转换为5。函数返回值的隐式转换与算术的隐式类型转换是相同的详细请看我这篇文章《数学计算类操作符 和 算术类型转换》 iii. 函数内容是分支结构的 如果函数中存在 if 等分⽀的语句则要保证每种情况下都有return返回否则容易出现编译错误。 iv. main函数中的return语句 return 语句在 main 函数中的作用是结束程序的执行并返回一个整数值给操作系统。这个整数值通常用于表示程序的退出状态其中0表示程序正常退出非零值表示程序异常退出。 返回非0值的错误信息了解即可 返回1——文件打开失败如果程序试图打开一个不存在的文件或者没有权限访问的文件返回2——内存分配失败如果程序在运行过程中无法分配足够的内存空间返回3——无效的输入参数如果程序接收到无效的输入参数返回4——运行时错误如果在程序执行过程中发生了除以零、数组越界等运行时错误 这里列举了4个错误的整型返回值实际上还有很多种。 四、main的返回类型与参数了解即可 #1. main的返回类型 i. int  main() 形(标准) 这是C99中标准的main函数使用形式。int返回类型使得main函数能够向操作系统返回程序的退出状态返回0通常表示程序正常退出而返回非0值表示程序异常退出。上面也有举例提及 ii. main() 形 早期的C代码中历史上常常可以看到没有明确指定返回值的主函数即main()。这样写是因为函数定义不明确返回类型时系统会默认为int型所以这样写也是返回一个整数值。 在C99的规定中这是一种不标准的写法建议不要这样写。 iii. void  main()  形 首先要明确的一点这是一种错误的写法历史上void main()也从未在C标准或C标准中得到定义。 虽然返回值是void也能执行main函数里的内容但是main函数也是会被其他函数调用的而调用main函数的函数需要知道程序是否正常退出、异常退出的原因是什么。比如mainCRTStartup()函数与__mainCRTStartup()函数。{调用逻辑mainCRTStartup()函数 — __mainCRTStartup()函数 — main()函数 } #2. main的参数个数 虽然main函数可以不写参数但其实参数表上是有参数的 i. 一个参数 在某些平台上main函数可能会接受一个参数例如main(argc)但这种形式并不标准且现在很少见。 ii. 两个参数 这是最标准的main函数形式接受命令行参数个数和参数数组即int main(int  argc, char* argv[ ]) 。 iii. 三个参数 在一些特定的系统或编译器扩展中main函数可能会有第三个参数用于传递环境变量例如int main(int  argc, char* argv[ ], char* envp[ ])。这种形式不是标准形式但在Windows等系统中比较常见。 #3. 参数argc和argv了解即可 argc是一个整型变量表示传递给程序命令的参数数量程序名本身作为第一个参数。例如如果你运行一个名为program的程序并传递了两个参数arg1和arg2那么argc的值将是3。 argv是一个字符指针数组其中每个元素指向一个字符串这些字符串是传递给程序的命令行参数。除了argv[0]通常是程序的名称其他argv[n]代表第n-1个参数。比如argv[1]是第一个参数argv[2]是第二个参数依此类推。 int main(int argc, char* argv[]) {printf(文件名: %s\n\n, argv[0]);printf(参数个数: %d\n, argc);return 0; } 五、数组作为函数参数重中之重 #1. 数组传参的本质 数组传参的本质是传递该数组的地址(首元素地址)传递的地址值交给形式指针变量来管理。而并不是像形参变量那样调用函数时会申请内存空间数组的传递并不会开辟新空间且函数操作的是原数组的内存空间。当然函数调用的时候会申请空间给形式指针变量的创建。 以下面的代码为例参数表中的arr其实并不是数组而是指针后面我会讲解 void print_arr(int arr[], int n) {for (int i 0; i n; i)printf(%d , arr[i]);printf(\n); } int main() {int a[5] { 1,2,3,4,5, };size_t sz sizeof a / sizeof a[0];print_arr(a, sz);return 0; } 可以发现arr的值是与a的值、a的值和a[0]的值是相等的这说明函数调用时数组a传参给函数并没有申请一块新的连续空间来拷贝数组a而是用指针arr来对原数组a的内存空间进行操作。 #2. 不存在形式数组(下标操作符失效) 先说结论其实参数表中的接收数组并不是真正的数组(因为函数并未对原数组进行拷贝)而是一个指针。由于这是形式参数可以称之为形式指针。 补充知识数组也是有数据类型的去掉数组名就是数组的类型了比如int  arr[2][4]的类型是int [2][4]。详细请看《一维、二维数组的基础知识超详细总结》 下标操作符[ ]失效而在函数参数表中下标操作符失去了确定数组类型的作用。但它起到了新的作用下标操作符的个数反映着形式指针的级数。 补充因为接收变量是个形式指针而不是数组。所以你在函数定义时在“伪数组”下标写上数字和不写数字是一样。 其实刚刚的例子除了arr的值与arr的值不同可以看出来arr是指针其实还有另一种看法 伪数组arr的类型是 int* 型这是个标准的指针类型而原数组a的类型是 int[5] 型这是个标准的数组类型。所以可以看出arr并不是一个形式数组而是一个形式指针。 #3. 二维数组传参不能省略列 数组传地址给函数后函数只知道这是一片连续空间但不知道你有没有对这块连续空间进行特殊的规划。又由于内存寻址公式的存在你必须写下列数函数才知道这块连续空间是怎么划分。 如果你把函数声明(或定义)写成int  arr_print( int arr[ ][ ]int rowint col )。这样是不够的此时函数只知道用1个二级指针来管理这块连续的内存空间但并不知道要怎么划分。 补充函数必须通过列数才能知道划分方法与一维数组传参一样接收变量的类型是指针类型所以行下标写不写上都一样。 六、嵌套调用与链式访问 嵌套调用函数内部调用另一个函数。 (补充递归调用是函数内部调用自己) 假设我们计算某年某⽉有多少天我们可以设计2个函数来实现: is_leapyear()根据年份确定是否是闰年 days()调⽤函数is_leapyear确定是否是闰年后再根据月份计算这个月的天数 int is_leapyear(int year) {if (((year % 4 0) (year % 100 ! 0)) || (year % 400 0))return 1;elsereturn 0; } int days(int year, int month) {int days[] { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };int day days[month];if (is_leapyear(year) month 2) //这里嵌套调用了is_leapyear()day 1;return day; }链式访问将⼀个函数的返回值作为另外⼀个函数的参数。 比如“ printf( %zd\n, strlen(abcdef) ) ”这里函数strlen的返回值也是函数printf的参数像链条⼀样将函数串连起来。 七、函数的声明与定义 #1. 声明与定义的区别 和 注意事项 格式上函数声明与函数定义相比去除了大括号以及其中的内容在函数头的末尾加上了分号。 这是函数定义 int add(int a, int b) { return ab; }这是函数声明 int add (int a, int b); 1. 单个文件中 建议函数被调用前一定要有声明有定义也可以因为函数定义算是一种特殊的函数声明。 2. 多个文件中 建议为了有条理建议把函数声明、函数定义和主函数测试分开放在3个文件里。分成一个.h文件和两个.c文件(1)自定义头文件.h存放自定义函数的声明以及库函数的头文件(2)其中一个.c文件存放函数定义(3)另一个.c文件存放main函数和测试用例函数。 注意两个.c文件要包含自定义头文件.h 例如 #2. 未声明的函数  对于未声明的函数编译器会默认函数的返回值是int型。 用代码举例此时两个.c文件都没有包含函数声明的头文件 我们把鼠标放在函数名上就能显示函数的类型 我们可以发现如果没有头文件声明那么函数默认返回类型是int型。 当我们点击生成解决方案代码是通过了检测的 其实准确来说失去了头文件关于该函数的声明代码是失去了对该函数的格式检查的。 #3. 头文件声明的底层逻辑 和 函数调用操作符() 1.头文件的本质 头文件本身不会参与链接它们只是包含了一些函数声明、宏定义和类型定义等信息。编译器会将这些信息整合到目标文件中然后链接器会将多个目标文件以及库文件链接在一起生成最终的可执行文件或库文件。所以头文件的作用是提供代码的结构和依赖关系信息。 头文件提供的依赖关系信息使得编译器在编译前可以检查函数格式是否正确。对于函数的检测检查的东西包括(1)函数返回类型、(2)参数的个数、(3)每个参数的数据类型。 2. 无头文件时的底层逻辑 没有头文件声明时编译器会把这些东西看作外部函数在其他地方有定义。这时候编译器会使用默认的函数声明即“ int  函数名 (void) ”。 编译器使用默认函数声明后系统不再对使用的函数格式进行检查链接器会把这两个.c文件链接成一个.exe文件然后交给CPU运行。 因为后续系统不再做检查所以使用函数时即使输入的参数类型不符、参数个数不符这些问题都会被忽略。 代码举例 test.c文件main函数测试 #includestdio.h int main() {int a[5] { 1,2,3,4,5 };int c arr_print(a, 5, dad); 这里还多输入了一个无关参数“dad”printf(\n函数返回值%d\n, c); 用c接收默认返回类型int型的值return 0; } function.c文件数组打印函数 void arr_print(int arr[], int n) {for (int i 0; i n; i)printf(%d , arr[i]);printf(\n); } 运行结果 现在是默认声明“int  arr_ptint(void)”因为参数表是void的系统不管你写不写。但既然我们写进了参数它还是会按照正常的参数表顺序读取参数的。这里我们多了一个参数“dad”因为没有第3个接收变量所以并没有被函数读入。 如果我们补齐头文件的声明那么还没编译就会报错 这里指的是明明声明函数的返回类型是void你却用一个整型变量c来接收非法返回值。 为什么程序还能找到函数体并运行函数因为有函数调用操作符()。 多个文件被链接器链接成一个文件后函数调用操作符()可以解析函数名并找到函数体的地址。 本期的内容到这里就结束了。函数的知识真的是多而杂写得我真的是太难受了还请您多多支持 Thanks♪(ω)
http://www.hkea.cn/news/14286037/

相关文章:

  • 北京平谷区最新消息新闻济源网站优化
  • php网站颜色改变做地暖工程的网站
  • 山东网站建设最便宜哪个装修公司比较好
  • 网站开发工程师就业前景html个人主页简单源码
  • 360如何做网站优化一个网络空间如何做两个网站
  • 温州外贸网站建设公司全国城建中心官方网站
  • 网站前台设计软件物流公司介绍模板
  • 呼和浩特网站开发 千投中企动力网站后台 好用吗
  • c2c网站建站的标准网站开发的工作要求
  • 网站设计报价表网站建设协议书 保密条款
  • 烟台网站制作厂家联系方式wordpress 自定义菜单
  • 如何网站公司小程序辽宁建设工程信息网官网新网址
  • 网站和手机网站建设搜索引擎友好的网站
  • 如何做网站网页旁边的留言框租房网58同城网租房
  • 全国加盟网站大全摄影网站的市场可行性
  • 调查网站赚钱深圳外贸公司qc招聘
  • 北京网站建设方案哪家好网页网络游戏
  • 建构网站如何做网站新手引导
  • 网站商城建设套餐厦门杏林建设企业网站
  • ftp备份wordpress信息流优化师需要具备哪些能力
  • 郑州哪家公司做网站新闻稿撰写
  • wordpress站群管理破解版国外网站都不能上怎么做跨境电商
  • 有域名了 怎么做网站织梦怎么修改网站模板
  • 网站优化标题免费行情软件app一个
  • 浙江网站备案流程东莞专业网站制作设计
  • 国内做外贸如何访问外国网站企业网络建设
  • 网站可以增加关键词吗夜蝶直播app
  • 为网站做一则广告语电商首页设计分析
  • 制作响应式网站房产网签查询
  • 建设平台网站百度排名服务