-
for 循环
for(表达式1; 表达式2; 表达式3)
{
//循环体
}表达式1:循环初始化
表达式2:循环结束 或 循环执行条件
表达式3:循环步长执行顺序:
a. 执行表达式1(当前循环中,只执行一次)
b. 执行表达式2,判断循环是否执行
若成立,执行 c
不成立,执行 f
c. 执行循环体
d. 执行表达式 3,改变循环步长,使循环趋于结束,或使循环能够继续执行
e. 执行 b
f. 结束强制退出循环
break:
直接跳出循环
contiune:
略过本次循环,执行下一次循环
return:
结束整个函数在 for 循环中,表达式1, 表达式2, 表达式3 可以任意省略
若表达式2 省略,则在循环体中,要有能够使循环结束的条件,否则将陷入死循环
表达式3 省略,则循环体中,要有使循环趋于结束的条件死循环的写法:
while(1)
{
//…
}do
{}while(1);for(; ; )
{}在循环体里定义的变量,只能在循环体中使用
当循环体只有一个语句时,{} 可省略不写思考:
求 0 ~ 100 之间所有数的和,
含 3 的数据,不统计到结果中!各位数为 3 或 十位数为 3
num % 10 == 3 || num / 10 == 3
-
函数
(1)概念
把实现特定功能的代码,作为一个独立单元,使其可以重复使用
即把相对独立的某个功能抽象出来,使之成为程序中的一个独立实体;
(2)为什么使用函数??
a. 使程序模块化,提高开发效率
b. 使程序变得简短清晰
c. 有利于程序维护
d. 提高代码的重用性(复用)
(3)函数的分类
函数定义角度:
库函数:
系统提供,无需用户定义,使用时包含相应的头文件即可,无需在
源文件中做类型说明
如:
printf()/scanf()/getchar()/putchar() —> stdio.h
自定义函数:
由用户按需要写的函数,需实现具体细节,使用时需做类型说明
过程角度:
有返回值:
此类函数被调用执行完毕后,将会向调用者返回一个执行结果,称之为函数返回值
函数返回值的类型必须在定义时和函数声明中明确其类型
无返回值: — void
函数执行完毕后,无需向调用者返回数值
数据传送角度:
无参函数:
函数定义,函数声明,以及函数调用中,均不带参数
主调函数和被调函数之间无数据传送
ch = getchar();
有参函数:带参函数
实参(实际参数):
函数调用时给定的参数
形参(形式参数):
函数定义和函数声明时的参数为形式参数
在函数定义期间使用
putchar(ch);
(4)函数特性
在 C 中,所有函数的定义,包括 main 在内,都是平行关系
不能在函数中定义另外一个函数,即不可嵌套定义
//下面定义方式是错误的
void add()
{
//…
void sum()
{
//…
}
}
函数之间允许相互调用,同样也允许自己调用自己,称之为递归调用
发起调用的函数:主调函数
主函数可以调用其他函数,其他函数不允许调用主函数
(5)函数定义
一般形式
类型说明符 函数名(参数列表)
{
//声明语句或变量定义语句
//执行语句
}
类型说明符:char,int,short,float,double,long…
函数名:驼蜂命名法
说明:
类型说明符和函数名称为函数头;{} 里的内容称为函数体
类型说明符指明了该函数的返回类型,实际时函数返回值的类型
参数列表:
若为空,则为无参函数,不为空则为有参函数
类型说明符1 变量名1, 类型说明符2 变量名2, …
(6)函数声明
函数在调用之前,应声明该函数
若函数定义在调用之前,则无需声明,否则需在调用之前进行声明!
函数声明可以放在函数调用之前的任意位置!
函数声明一般放在头文件包含之后
或者放在头文件中
(7)参数的特点
a. 形参只有在调用时,才分配内存单元,在调用结束时,立即释放所分配的内存单元。
因此形参只在函数内部有效
b. 实参可以是常量,表达式,函数等等,无论实参时何种类型的量,在进行函数调用时,
他们都必须有确定的值。以便将值传递给形式参数
c. 实参和形参在数量,类型,顺序上应严格一致,否则会出现不匹配的错误
int add(int a, int b, double ret);
add(66, 88, 3.14); //OK
add(66, 3.14, 88); //Error
d. 函数调用过程中,数据传送是单向的,只能把实参的值传给形参,
不能把形参的值反向传给实参;
====================================================================================