循环与函数(篇五)

  1. 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

  2. 函数
    (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. 函数调用过程中,数据传送是单向的,只能把实参的值传给形参,
不能把形参的值反向传给实参;

====================================================================================

千里之行,始于足下!
原文地址:https://www.cnblogs.com/MINAIot/p/13041016.html