一、函数
(一)什么是函数
任何一个C语言程序都是由一个或者多个程序段(小程序)构成的,每个程序段都有自己的功能,我们一般称这些程序段为“函数”。
(二)函数的定义
目的:将一个常用的功能封装起来,方便以后调用
步骤:确定函数名,确定函数体,调用
格式:返回值类型 函数名(形式参数列表)
{函数体}
(三)函数的调用
1 int average(int num1,int num2) 2 3 { 4 5 return (num1 + num2)/2; 6 7 } 8 9 int main() 10 11 { 12 13 int a = 1; 14 15 int b = 3; 16 17 int c = average(a,b); //调用函数 18 19 return 0; 20 21 }
示例:
(四)函数的参数
①. 形参:定义函数时,函数名后面的参数 如num1和num2
②. 实参:调用函数时,传人的具体数据 如a和b
③. 形参和实参的个数必须相等
④. 函数体内部不能定义和形参同名的变量
⑤. 如果是基本的数据类型作为形参,则是纯粹的值传递,修改函数内部形参的值并不会影响到实参的值
⑥. 一个函数可以没有形参,也可以有无限个形参
(五)函数的返回值
1.return 的作用:
①. 退出函数
②. 返回一个具体的值给函数的调用者
2.返回值使用注意:
①. C语言是弱语法弱类型的语言,非常不严格
②. 如果没有写清楚返回值的类型,则默认为int型的
③. void代表没有返回值
④. 就算明确声明了返回值类型,也可以不返回任何的值
⑤. C语言默认情况下,不允许有两个同名的函数
(六)函数使用注意
①. 默认不允许函数重名
②. 函数之间是平等的,不能够嵌套定义
③. 函数不可以重复定义,但是可以重复声明,只要是在调用前声明就可以,地方随便
④. 函数如果是只要声明没有定义,那么编译可以成功,但链接时会失效
(七)多人协作开发
#include<stdio.h>是一个系统头文件。
#include<abc.txt>相当于把abc.txt文件中的所有内容以纯文本的方式拷贝到当前位置。
""表示文件与.c文件处于同一路径,可以使用相对路径也可以使用绝对路径。左边有/的是绝对路径,没有/则为相对路径。
注意:自定义的文件使用"",系统文件使用<>。
函数如果在调用时,函数定义在调用之后,且前面没有进行相应的声明,则编译器报错;
调用函数,没有函数声明,编译器不会报错,链接时报错,不定义函数反而不报错。
链接:把项目中所以相关的.o目标文件和c语言的函数库合并在一起,生成可执行文件。
通常:
①. 函数的定义放在.c文件中,函数的声明放在.h文件中
②. 如果要是有某个.c文件中定义的函数,只需要包含.c文件对应的.h文件即可
③. .h文件生下来就是打酱油被别人拿来拷贝包含的,编译链接时不用写出
(八)函数的补充
(1)main函数
返回值是返回给操作系统的,0为正常退出,其他值为非正常退出。
(2)printf函数
返回值为字符数。如printf("abc");则返回值为3,若printf("abc男\n");的返回值为7,因为一个中文在 Mac OS X 系统中占3个字符。
(3)scanf函数
①.使用前必须加入#include <stdio.h>。
②.调用scanf函数时,需要传入变量的地址作为参数,scanf函数会等待输入数据,并且将输入的数据赋值给地址对应的变量。
③.用scanf函数接收多个数值时,数值之间的分隔符是任意的。
④.scanf的第一个参数中不要包含\n,比如scanf("%d\n", &a); 这将导致scanf函数无法结束。
二、运算
(一)算术运算
C语言一共有34种运算符,包括常见的加减乘除运算
①. 加法:+ 还可以表示正号
②. 减法:- 还可以表示负号
③. 乘法:* 非数学意义上的X
④. 除法:/ 注意1/2的值为0,并不是二分之一
⑤. 取余(模运算):两个整数相除之后的余数(注意两边都必须是整数,正负性取决于%左侧的数值)
注意:
①. int a = 10.8;//丢失精度。结果为10——自动类型转换
②. int a = (int)10.8;//把10.8强制转换为整型——强制类型转换
③. Double c = 10.6 + 6//结果为16.600000。在计算机中,拿两个数值进行运算,如果类型不同则进行自动类型提升。即把6转为6.000000后再参与运算——自动类型提升
(二)赋值运算
①.简单赋值
int a = 10 + 5;a = b = 10;//从右向左,左边不能为常量
②.复合赋值
a = a + 5; => a += 5;
a = a * 5; => a *= 5;
a += 5 * 6 + 4; => a = a +(5 * 6 + 4)
提示:运算顺序取决于运算符的优先级和结合的顺序。
(三)自增自减
int a = 10;
把a的值加1有四种方法:
①. a = a + 1;
②. a += 1;
③. a++;
④. ++a;
简单区分a++和++a。
int b;
int a = 10;
b = ++a; //a == 11,b == 11;a先把值加1为11,再赋值给b
b = a++; //a == 11,b == 10;a先把值10复制给b,a自己再加1为11
b = (a++) + (++a); //a1 == 10,a2 == 12,b == 22
b = (++a) + (a++); //a1 == 11,a2 == 11,b == 22
注意:int d = 10++;//这种写法是错误的,因为对常量进行自加和自减没有任何意义。
(四)sizeof
作用:用来计算变量,常量或者是一种数据类型所占的内存字节数。
基本形式:sizeof(变量名|常量|数据类型),完成之后返回一个值。
①. Sizeof 变量|常量
②. Sizeof (变量|常量)
③. Sizeof (数据类型)
注意:数据类型一定要用括号括起来,不能写成sizeof 数据类型这样的形式。
(五)关系运算
(1)条件判断
默认情况下。在程序中写出的每一句正确的代码都会被执行,但很多时候我们需要在某个条件成立的情形下才执行某一段代码,如登录操作,这种情况可以使用条件语句来完成。
(2)真假
在C语言中,条件成立称为“真”,条件不成立称为“假”。
C语言规定,任何数值都有真假性,任何非0值都为真,只有0才为假,无布尔类型。
(3)关系比较
关系运算的结果只有两种情况,如果条件成立就为真,值为1,如果条件不成立就为假,值为0。有6种运算符,分别是:(1) < (2) <= (3) > (4) >= (5) == (6) !=
(4)使用注意
①. == 和 != 优先级相等,其他四个关系运算符的优先级相等,且前者的优先级低于后者。如2 == 3 > 1 应该先计算3 > 1
②. 关系运算符中,若优先级相同,则“从左往右”结合。如4 > 3 < 2,先计算4 > 3
③. 关系运算符的优先级低于算术运算符。如3 + 4 > 8 - 2 相当于(3 + 4) > (8 - 2)
④. 练习5 != 4 + 2 * 7 > 3 == 10 先计算5 != 18 > 3 == 10,5 != 1 == 10,1 == 10,假
(六)逻辑运算
逻辑运算的结果只有两个:真(0)和假(1)
①. 逻辑与 && 条件1 && 条件2 只有的那个条件1和条件2都成立时,才为真否则为假。
②. 逻辑或 || 条件1 || 条件2 当条件1或条件2中有一个成立时就为真,都不成立时为假。
③. 逻辑非 ! !条件 取反
注意:逻辑运算符在进行运算时,只要能够确定整体的真假性,后面的条件就不再进行而是直接忽略。
int a = b = 10;
int c = (a > 5) && (++b >= 11);//此时a == 10,b == 11,c == 1
int c = (a < 5) && (++b >= 11);//此时a == 10,b == 10,c == 0
提示:在进行逻辑运算时,如果搞不清楚各个符号的优先级,可以使用()。
(七)三目运算
双目:需要两个值参与运算
单目:1个数值参与运算 如!5
三目:需要3个数值参与
格式:条件?数值1:数值2
先判断?前的条件,若条件成立则返回数值1,若条件不成立则返回条件2。
要求比较a和b的值,把数值大的存入到c中 c = a > b ? a : b
比较a,b,c三个数的值,把最大的值存入到d中
int abmax = (a > b) ? a : b;
d = abmax > c : abmax : c;