C语言 |
您所在的位置:网站首页 › 半岛铁盒的故事 › C语言 |
函数概念
函数是C语言的功能单位,实现一个功能可以封装一个函数来实现。定义函数的时候一切以功能为目的,根据功能去定函数的参数和返回值。 函数的分类1、从定义角度分类(即函数是谁实现的) 1.库函数(c语言实现的) 2.自定义函数(程序员自己实现的函数) 3.系统调用(操作系统实现的函数) 2、从参数角度分类 1.有参函数:函数有形参,可以是一个,或者多个,参数的类型随便,完全取决于函数的功能。 2.无参函数:函数没有参数,在形参列表的位置写一个 viod 或什么都不写。 3、从返回值角度分类 1.带返回值的函数:在定义函数的时候,必须带着返回值类型,在函数体里,必须有 return ,如果没有返回值类型,默认返回整型。 注:1.在定义函数的时候,函数的返回值类型,到底是什么类型取决于函数的功能 2.没有返回值的函数:在定义函数的时候,函数名字前面加 void ,在函数里不需要 return。如果想结束函数,返回到被调用的地方,return ;什么都不返回就可以了。 函数的定义1、函数的定义方法 返回值类型 函数名字(形参列表) { //函数体,函数的功能在函数体里实现 }注意:形参必须带类型,而且以逗号分隔。函数的定义不能嵌套,即不能在一个函数体内定义另一个函数。 函数的声明1、对已经定义的函数,进行说明,函数的声明可以声明多次 2、为什么要声明:有些情况下如果不对函数进行声明,编译器在编译的时候,可能不认识这个函数,以为编译器在编译C程序的时候,从上往下编译的。 3、声明的方法:什么时候需要声明,主函数和被调函数在同一个 .c文件的时候;(1)、被调函数在上,主函数在下,这种情况下不需要声明。(2)、被调函数在下,主调函数在上,这种情况编译器从上往下编译,在 main 函数(主调函数),不认识被调函数,需要声明。 直接声明:将被调函数的第一行拷贝过去,后面加分号 间接声明:将函数的声明放在头文件中, .c程序包含文件即可。 主调函数和被调函数不在同一个 .c文件的时候一定要声明。直接声明将被调函数的第一行拷贝过去,后面加分号,前面加 extern。间接声明将函数的声明放在头文件中, .c程序包含文件即可。 函数的调用函数的调用方法 变量=函数名(实参列表);//带返回值的 函数名(实参列表); //不带返回值的1、有无返回值 1.有返回值的,根据返回值的类型,需要在主函数中定义一个对应类型的变量,接收返回值 2.没有返回值的函数,不需要接收返回值 2、有无形参 函数名(实参列表);//带形参的 函数名();//没有形参的注意:实参,可以常量,可以变量,或者表达式。形参变量,是被调函数的局部变量。 函数总结 C语言编译过程1、预编译:将 .c中的头文件展开、宏展开,生成的文件是 .i文件 2、编译:将预处理之后的 .i文件生成 .s汇编文件 3、汇编:将 .s汇编文件生成 .o目标文件 4、链接:将 .o文件链接成目标文件 include#iniclude //用尖括号包含头文件,在系统指定的路径下找头文件。 #include"" //用双引号包含头文件,闲杂当前目录下找头文件,找不到,再到系统指定的路径下找。 注意:include 经常用来包含头文件,可以包含 .c文件,但尽量不要包含 .c。因为include包含的文件会在预编译被展开,如果一个 .c被包含多次,展开多次,会导致函数重复定义,所以不要包含 .c文件。 注意:预处理只对 include等预处理操作进行处理并不会进行语法检查,有语法错误也不会报错,在编译阶段才进行语法检查。 defiine宏定义用 define 去定义,宏是在预编译的时候进行替换。 1、不带参宏 #define 标识符 字符串在预编译的时候如果代码出现了标识符就用字符串去替换。 宏的优点:只要修改宏定义,其他地方在预编译的时候就会重新替换。 注意:宏定义之后不要加分号 宏定义的作用范围:从定义的地方到本文件末尾。 如果想在中间终止宏的的定义范围使用 #undef 标识符 2、带参宏 #define 宏名(形参) 字符串注意:带参宏的形参没有类型名 宏名(实参)将来在预处理的时候替换成实参替代字符串中的形参,其他字符保留。 注意:带参宏是在预处理的时候进行替换 3、带参宏和带参函数的区别 带参宏被调用多次就会展开多次,执行代码的时候没有函数调用的过程,不需要压栈弹栈。所以带参宏是浪费了空间,因为被展开多次,节省时间。 带参函数,代码只有一份,存在代码段,调用的时候去代码段取指令,调用的的时候需要压栈弹栈。有个调用的过程。所以说,带参函数浪费时间,节省空间 带参函数的形参是有类型的,带参宏的形参没有类型名。 选择性编译1 #ifdef xxx 代码一 #else 代码二 #endif如果在当前 .c ifdef之前定义过xxx,就编译代码一,否则编译代码二。 注意:和if……else语句的区别,if……else语句都会被编译,通过条件选择性执行代码,而选择性编译,只有一块代码被编译。 2 #ifndef xxx 代码一 #else 代码二 #endef和第一种互补。这种方法,经常用在防止头文件重复包含。 3、 #if 表达式 程序一 #else 程序二 #endif如果表达式为真,编译第一段代码,否则编译第二段代码。选择性编译都是在预编译阶段处理的。 |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |