详解分支和循环结构(剖析if语句,switch语句,while循环,for循环,do-while循环)

介绍

C语⾔是结构化的程序设计语⾔,这⾥的结构指的是顺序结构、选择结构、循环结构,C语⾔是能够实现这三种结构的,其实我们如果仔细分析,我们⽇常所⻅的事情都可以拆分为这三种结构或者这三种结构的组合。
我们可以使⽤ifswitch实现分⽀结构,使⽤for whiledo while 实现循环结构。

分支结构

if语句

if(表达式)
    语句1
else
    语句2

在这里插入图片描述

表达式成⽴(为真),则语句执⾏,表达式不成⽴(为假),则语句不执⾏
在C语⾔中,0为假,⾮0表⽰真,也就是表达式的结果如果是0,则语句不执⾏,表达式的结果如果是不是0,则语句执⾏。
就以判断是否成年来演示吧:

#include<stdio.h>

int main()
{
    
    
    int age=0;
    scanf("%d",&age);
    if(age<18)
        printf("已成年\n");
    else
        printf("未成年\n");
    return 0;
}

当然这只是最基本的结构,下面还有三种稍复杂一点的:

分支中包含多条语句

上面无论是if还是else后都只有一条语句,那如果更多呢?则需要用{}将语句括起来

#include<stdio.h>

int main()
{
    
    
    int score=0;
    scanf("%d",&score);
    if(score>=80)
    {
    
    
        printf("您已达良好:>\n");
        printf("考得好,下次继续:>\n");
    }
    else
    {
    
    
        printf("您未达良好:<\n");
        peintf("下次加油:>\n");
    }
    return 0;    
}

嵌套if

利用嵌套if可以实现多重判断,结构如下:

if(表达式1)
    语句1;
else if()
    语句2;
else
    语句3;

悬空else

这里就随便举一个例子吧:
在这里插入图片描述
可以看出什么都没有打印,这是因为第一个if后表达式虽为真,但第二个if后表达式为假。
还有一个要点就是:else悬空时,else总是跟最接近的if匹配。
在这里插入图片描述
虽然知道了对齐规则,但带上适当的⼤括号,代码的逻辑就会更加的清晰,所以以后在写代码的时候要注意括号的使⽤,让代码的可读性更⾼。

switch语句

一般结构:

switch(expression)
{
    
    
    case value1:statement
    case value2:statement
    default:statement
}

若expression没有与之对应的value则执行default
switch语句中的case和default的顺序问题
switch语句中 case ⼦句和 default⼦句有要求顺序吗?default只能放在最后吗?其实,在 switch 语句中 case语句和default语句是没有顺序要求的,只要你的顺序是满足实际需求的就可以。
不过我们通常是把 default ⼦句放在最后处理的。
注:
• switch 后的 expression 必须是整型表达式
• case 后的值,必须是整形常量表达式

在这里插入图片描述
为什么输入4会出现图中的错误呢?这是因为进入case4走完后并没有结束,而是继续进入case5···,所以使用switch语句时还要注意:
• case 和后边的数字之间必须有空格
•每⼀个 case 语句中的代码执⾏完成后,需要加上 break ,才能跳出这个switch语句。


循环结构

while循环

while(表达式)
    语句;

while语句具体执行流程:
在这里插入图片描述
首先上来就是执行判断表达式,表达式的值为0,循环直接结束;表达式的值不为0,则执⾏循环语句,语句执行完后再继续判断,是否进行下一次判断。
我们就以一个例题来深入了解一下吧。输入一个正的整数,逆序打印这个整数的每一位
eg:输⼊:1234,输出:4 3 2 1
题目解析:

  1. 要想得到n的最低位,可以使⽤n%10的运算,得到的余数就是最低位,如:1234%10得到4
  2. 要想去掉n的最低位,找出倒数第⼆位,则使⽤ n=n/10 操作就可以去掉最低位的,如:n=1234/10得到123,123相较于1234就去掉了最低位,123%10就得到倒数第⼆位3。
  3. 循环1和2两个步骤,在n变成0之前,就能到所有的位。
#include<stdio.h>

int main()
{
    
    
    int num=0;
    scanf("%d",&num);
    while(n)
    {
    
    
        printf("%d ",n%10);
        n/=10;
    }
    return 0;
}

while循环中的break和continue
我们看下面一段代码:
在这里插入图片描述
打印了1,2,3,4后,当i等于5的时候,循环正 break 的地方终止,不再打印,不再循环。
所以 break的作用就是永久的终止循环,只要 break被执行,break外的第⼀层循环就终止了。那以后我们在循环中,想在某种条件下终止循环,则可以使用 break 来完成我们想要的效果。
那我们在思考一个问题,如果我们将break换成continue呢?
在这里插入图片描述
到这里我们就能分析出来, continue可以帮助我们跳过某⼀次循环continue 后边的代码,直接到循环的判断部分,进行下⼀次循环的判断,如果循环的调整是在 continue 后边的话,可能会造成
死循环。

for 循环

一般形式:

for(表达式1;表达式2;表达式3)
    语句;

表达式1 ⽤于循环变量的初始化
表达式2 ⽤于循环结束条件的判断
表达式3 ⽤于循环变量的调整
for循环执行流程:
在这里插入图片描述
首先执行表达式1 初始化循环变量,接下来就是执行表达式2 的判断部分,表达式2 的结果如果==0,则循环结束; 表达式2 的结果如果!=0则执行循环语句,循环语句执行完后,再去执行表 达式3 ,调整循环变量,然后再去表达式2的地方执行判断,表达式2 的结果是否为0,决定循环是否继续。
整个循环的过程中,表达式1初始化部分只被执行1次,剩下的就是表达式2、循环语句、表达式3在循环。
让我们来一道练习吧:计算1~100之间3的倍数的数字之和

#include <stdio.h>
int main()
{
    
    
    int i = 0;
    int sum = 0;
    for(i=1; i<=100; i++)
    {
    
    
        if(i % 3 == 0)
        sum += i;
    }
    printf("%d\n", sum);
    return 0;
}

for循环中的break和continue
其实和 while 循环中的 break⼀样, for循环中的break也是用于终止循环的,不管循环还需要循环多少次,只要执行到了 break,循环就彻底终止。
break呢?我们直接上代码
在这里插入图片描述
我们看调试结果少了5,所以在 for 循环中 continue的作用是跳过本次循环中 continue 后的代码,直接去到循环的调整部分。未来当某个条件发⽣的时候,本次循环无需再执行后续某些操作的时候,就可以使用continue来实现。

do-while循环

一般形式:

do
   语句;
while(表达式);

do-while循环执行流程:
在这里插入图片描述
do while循环中先执⾏图上的“语句”,执行完语句,在去执⾏“判断表达式”,判断表达式的结果是!=0,则继续循环,执行循环语句;判断表达式的结果==0,则循环结束。
所以在 do while 语句中循环体是⾄少执行一次的,这是 do while循环比较特殊的地⽅。
我们继续以一个题目来练习一下吧:输入一个正整数,计算这个整数是几位数?
eg:输入:24534 输出:5

#include <stdio.h>
int main()
{
    
    
    int num = 0;
    scanf("%d", &num);
    int cnt = 0;
    do
    {
    
    
        cnt++;
        num = num / 10;
    } while (num);
    printf("%d\n", cnt);
    return 0;
}

这⾥并非必须使⽤ do while 语句,但是这个代码就比较适合使用 do while循环,因为num即使是0,也是1位数,要统计位数的。
do-while循环中的break和continue
do-while循环中的breakforwhile非常相似。那continue呢?上代码
在这里插入图片描述
可以看出程序死循环了,这是因为continue跳过了后面代码,使得i一直为5,所以在do-while循环中 continue的作用是跳过本次循环中 continue 后的代码,直接去到循环的判断部分。

猜你喜欢

转载自blog.csdn.net/2301_77404033/article/details/131902062