C语言 控制流

1.控制流

  • 程序语言中的控制流语句用于控制各计算操作执行的次序。
  • 根据对语句执行顺序的影响,C语言的其余语句大多属 于以下3大类。
    • 选择语句 (selection statement)。if 语句和switch 语句 允许程序在一组可选项中选择一条特定的执行路径。
    • 循环语句 (iteration statement)。while 语句、do 语句和 for 语句支持重复(循环)操作。
    • 跳转语句 (jump statement)。break 语句、continue 语句 和 goto 语句导致无条件地跳转到程序中的某个位置。(return 语句也属于此类。)

2.选择语句

2.1 if

  1. if 语句:表达一种 如果-则 的条件执行关系
  2. if-else 语句:表达一种 如果-否则 的互斥分支关系

if 语句

if(a%2 == 0)
{
    printf("a是偶数\n");
}

 if-else 语句

if(a%2 == 0)
{
    printf("a是偶数\n");
}
else
{
    printf("a是奇数\n");
}
  • if 语句可以单独使用,else 语句不可以,else 语句必须跟if语句配套使用
  • 不管是 if 语句还是 else 语句,代码块都必须使用大括号{}括起来,否则只有首句有效

2.2 switch

  • switch 语句是一种多路判定语句,它测试表达式是否与一些常量整数值中的某一个值匹 配,并执行相应的分支动作
switch (n)
{
case 1:
    printf("one\n");
    break;

case 2:
    printf("two\n");
    break;

case 3:
    printf("three\n");
    break;

default:
    printf("其他数字\n");
}
  • switch(n) 语句中的 n 必须是一个整型表达式,即 switch 判断的数据必须是整型
  • case 语句只能带整型常量,包括普通整型或字符
  • break 语句的作用是跳出整个 swtich 结构,没有 break 程序会略过case往下执行
  • default 语句不是必须的,一般放在最后面(因此不需要 break)

3.循环语句

  • 循环 (loop )是重复执行其他语句(循环体)的一种语句。在C语 言中,每个循环都有一个控制表达式,每次执行循环体(循环重复 一次)时都要对控制 表达式求值。如果表达式为真(即值不为零),那么继续执行循环。

3.1 while

  • while 循环:先判断,再循环

C语言 控制流_第1张图片

#include 
int main()
{
    int i = 1, sum = 0;
    while (i <= 100) // 步幅,循环跳出条件
    {
        sum += i;
        i++;
    }
    printf("%d\n", sum);
    return 0;
}
/*
1.程序运行到 while 时,因为 i=1,i<=100 成立,所以会执行循环体;执行结束后 i 的值变为 2,sum 的值变为 1。
2.接下来会继续判断 i<=100 是否成立,因为此时 i=2,i<=100 成立,所以继续执行循环体;
  执行结束后 i 的值变为 3,sum 的值变为3。
3.重复执行步骤 2
4.当循环进行到第100次,i 的值变为 101,sum 的值变为 5050;
  因为此时 i<=100 不再成立,所以就退出循环,不再执行循环体,转而执行while循环后面的代码
*/

3.2 do while

  • do-while 循环:先循环,再判断

C语言 控制流_第2张图片

#include 
int main()
{
    int i = 1, sum = 0;
    do
    {
        sum += i;
        i++;
    } while (i <= 100); // 注意while(i<=100);最后的分号“;”,这个必须要
    printf("%d\n", sum);
    return 0;
}

3.3 for

  • 上述例子中,步幅和判断条件,步进长度都被放到了不同的地方,代码结构较为松散。为了让程序更加紧凑,可以使用 for 循环来代替
for (表达式1; 表达式2; 表达式3)
{
    语句块
}
  • “表达式1”仅在第一次循环时执行,以后都不会再执行,可以认为这是一个初始化语句。
  • “表达式2”一般是一个关系表达式,决定了是否还要继续下次循环,称为“循环条件”
  • “表达式3”很多情况下是一个带有自增或自减操作的表达式,以使循环条件逐渐变得“不成立”
#include 
int main()
{
    int i, sum = 0;
    for (i = 1 /*语句①*/; i <= 100 /*语句②*/; i++ /*语句③*/)
    {
        sum += i;
    }
    printf("%d\n", sum);
    return 0;
}
/*
1.先执行“表达式1”(i=1)
2.再执行“表达式2”(i<=100),如果它的值为真(非0),则执行循环体,否则结束循环。
3.执行完循环体后再执行“表达式3”(i++)
4.重复执行步骤2和3,直到“表达式2”的值为假,就结束循环
*/

 C语言 控制流_第3张图片

  • for 循环中的 “表达式1(初始化条件)”、“表达式2(循环条件)”和 “表达式3(自增或自减)”都是可选项,都可以省略(但分号“;”必须保留)
int i = 1, sum = 0;
for (; i <= 100; i++)
{
    sum += i;
}
// 将 i=1 移到了for循环的外面
for (i = 1;; i++)
    sum = sum + i;
// 省略了“表达式2(循环条件)”,如果不做其它处理就会成为死循环
for (i = 1; i <= 100;)
{
    sum = sum + i;
    i++;
}
// 省略了“表达式3(自增或自减)”,就不会修改“表达式2(循环条件)”中的变量,这时可在循环体中加入修改变量的语句

4.跳转语句

  • 使用while或for循环时,如果想提前结束循环(在不满足结束条件的情况下结束循环),可以使用break或continue关键字

4.1 break

  • 当 break 关键字用于 while、for 循环时,会终止循环而执行整个循环语句后面的代码。break 关键字通常和 if 语句一起使用,即满足条件时便跳出循环
#include 
int main()
{
    int i = 0, j = 0, sum = 0;
    while (1) // 循环条件为死循环
    {
        sum += i;
        i++;
        if (i > 100)
            break;
        while (j < 50)
        {
            j++;
            break;
        }
    }
    printf("%d\n", sum); // 5050
    printf("%d\n", i);   // 101
    printf("%d\n", j);   // 50
    return 0;
}
  • 在多层循环中,一个 break 语句只向外跳一层

4.2 continue

  • continue 语句的作用是跳过循环体中剩余的语句而强制进入下一次循环。continue语句只用在 while、for 循环中,常与 if 条件语句一起使用,判断条件是否成立
#include 
int main()
{
    char c = 0;
    while (c != '\n') // 回车键结束循环
    {
        c = getchar();
        if (c == '4' || c == '5') // 按下的是数字键4或5
        {
            continue; // 跳过当次循环,进入下次循环
        }
        putchar(c);
    }
    return 0;
}
==>
0123456789
01236789
/*
本例我们输入的是 0123456789,当读取到4或5时,if的条件 c=='4'||c=='5' 成立,
就执行 continue 语句,结束当前循环,直接进入下一次循环,也就是说 putchar(c); 不会被执行到。
而读取到其他数字时,if的条件不成立,continue 语句不会被执行到,
putchar(c);就会输出读取到的字符。
*/
  • break与continue的对比:
    • break 用来结束所有循环,循环语句不再有执行的机会;
    • continue 用来结束本次循环,直接跳到下一次循环,如果循环条件成立,还会继续循环。

4.3 goto

  • goto语句直接跳转到本代码块中的标签处
  • 标签指的是以冒号结尾的标识符
#include 
int main()
{
    printf("%d\n", __LINE__); // 打印第4行

    // 无条件跳转到label处
    goto label;
    printf("%d\n", __LINE__); // 打印第8行,此处被略过
label:
    printf("%d\n", __LINE__); // 打印第10行
    return 0;
}
==>
4
10
  • goto语句常被用在程序的错误处理中
  • goto语句的无条件跳转不利于程序的可读性,一般不建议使用

5.循环嵌套

  • 在C语言中,if-else、while、do-while、for 都可以相互嵌套。所谓嵌套,就是一条语句里面还有另一条语句,例如 for 里面还有 for,while 里面还有 while,或者 for 里面有 while,while 里面有 if-else,这都是允许的
#include 
int main()
{
    int i, j;
    for (i = 1; i <= 4; i++) // 外层for循环
    {
        for (j = 1; j <= 4; j++) // 内层for循环
        {
            printf("i=%d, j=%d\n", i, j);
        }
        printf("\n");
    }
    return 0;
}
// 本例是一个简单的for循环嵌套,外层循环和内层循环交叉执行,外层for每执行一次,内层for就要执行四次。

你可能感兴趣的:(c语言,开发语言)