C语言超详细分支循环语句介绍

1.何为语句?​​​​​​​

C语句可分为五类:

1.表达式语句

2.函数调用语句

3.控制语句

4.复合语句

5.空语句

本文主要围绕控制语句进行分析和讲解。

控制语句是用于控制程序执行,以用于实现程序的各种结构方式,由固定的九种控制语句定义符组成。

可以分为三大类

第一类:条件判断语句也叫分支语句:if语句、switch语句;

第二类:循环执行语句:do while语句、while语句、for语句;

第三类:转向语句:break语句、goto语句、continue语句、return语句。

2.分支语句(选择结构)

2.1 if语句

if语句的语法结构:

if(表达式)
    语句1; //如果表达式的结果为真,语句1就会被执行。


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


//多分支
if(表达式1)
    语句1;
if else(表达式2)
    语句2;
else
    语句3;

C语言中,0表示为假,其余非0数字都是真。

接下来用代码来展示if语句的使用方法:

#include <stdio.h>

int main()
{
    if(1==2)
        printf("不对\n");  //不会打印,因为1不等于2,if条件表达式为假
    if(1==1)
        printf("对的\n");  //由于1等于1,if条件表达式为真 所以打印"对的"

    int a =10;
    if(a=3)
        printf("yes\n");  //由于3为非0数,所以打印"yes"
    
    int b=10;
    if(b==3)
        printf("no\n");  //由于10不等于3 所以if条件表达式为假  所以不打印


//if条件表达式可以用于逻辑的判断 比如判断是否成年
    int age=20;
    if(age>18)
        printf("成年了\n");
    else
    {
        printf("未成年\n");   //注意:如果if、else if还有else要跟多条语句时必须加上{}
        printf("现在才%d岁\n",age);
    }


//if多分支写法 多分支只会执行一个分支
    int age1=10;
    scanf("%d",&age1);

    if(age1<18)
        printf("青年\n");
    else if(age1>=18&&age1<=40)
        printf("中年\n");
    else if(age1>=40&&age1<=60)
        printf("壮年\n");
    else 
        printf("老年\n");
    return 0;
}

2.1.1悬空else
#include<stdio.h>

int main()
{
    int a=0,b=1;
    if(a==1)
        if(b==1)
            printf("xixi\n");
    else
        printf("hehe\n");
    return 0;
}

这样编写的代码是有问题的,我们实际上希望的是else(hehe)和if(a==1)是匹配的,但是当我们将此代码复制到编译器后,编译器会默认else(hehe)与if(b==1)匹配到一起。所以运行结果什么都不会打印。

原因在于:else是和它离得最近的if匹配的。

所以要想实现预期结果,则需添加{}进行代码块化处理。

#include<stdio.h>

int main()
{
    int a=0,b=1;
    if(a==1)
{
        if(b==1)
            printf("xixi\n");
}
    else
        printf("hehe\n");
    return 0;
}

由此可见,代码的规范十分有必要。

2.1.2练习

判断一个数是否为奇数

#include<stdio.h>

int main()
{
    int a=0;
    scanf("%d",&a);
    
    //判断
    if(a%2==1)
        printf("是奇数\n");
    else
        printf("不是奇数\n");

    return 0;
}

2.2switch语句

switch语句也是一种分支语句,常常用于多分支的情况。

int main()
{
    int day =0;
    scanf("%d",&day);

    //if(1==day)
    //    printf("星期一\n");
    //if(2==day)
    //    printf("星期二\n");
    //if(1==day)
    //    printf("星期三\n");
    //if(1==day)
    //    printf("星期四\n");
    //...

我们如果写出if...else的形式太复杂,那么我们就得用不一样的语法,就是switch语句。

switch(整型表达式)
{
    语句项;
}

其中语句项为case语句:

case 整型常量表达式;
    语句;
2.2.1switch的使用
int main()
{
    int day =0;
    scanf("%d",&day);
    
    switch(day)
    {
    case 1:
        printf("星期一\n");
    case 2:
        printf("星期二\n");
    case 3:
        printf("星期三\n");
    case 4:
        printf("星期四\n");
    case 5:
        printf("星期五\n");
    case 6:
        printf("星期六\n");
    case 7:
        printf("星期天\n");
    }
    return 0;
}

我们的预期是输入一个数字 然后打印出对应的星期几

 可以看到,程序打印是从星期二到星期天,这时需要注意:case只负责入口,没有负责出口,所以进入之后会往下执行所有的case。

在switch语句中,我们没办法直接实现分支,搭配break使用才可以实现真正的分支。

int main()
{
    int day =0;
    scanf("%d",&day);
    
    switch(day)
    {
    case 1:
        printf("星期一\n");
        break;
    case 2:
        printf("星期二\n");
        break;
    case 3:
        printf("星期三\n");
        break;
    case 4:
        printf("星期四\n");
        break;
    case 5:
        printf("星期五\n");
        break;
    case 6:
        printf("星期六\n");
        break;
    case 7:
        printf("星期天\n");
        break;
    }
    return 0;
}

加上break之后,可以看到按照预期结果执行了。

break语句的实际效果是 把语句列表划分成为不同的分支部分

2.2.2default字句

如上面的switch,如果我们输入的数字并不是1~7,比如输入8,会怎么样呢?

可以看到,什么都没打印。

因此可以看出如果输入的数字不是在1~7之内时,分支会自动跳过,那么如果我们不想直接跳过忽略时,就可以用default字句,写在任何一个case标签可以出现的位置。

当switch表达式的值并不匹配所有的case时,就会执行default语句

//在上面的代码加上
    default :
        printf("选择错误!\n");
        break;
{
    int day =0;
    scanf("%d",&day);
    
    switch(day)
    {
    case 1:
        printf("星期一\n");
        break;
    case 2:
        printf("星期二\n");
        break;
    case 3:
        printf("星期三\n");
        break;
    case 4:
        printf("星期四\n");
        break;
    case 5:
        printf("星期五\n");
        break;
    case 6:
        printf("星期六\n");
        break;
    case 7:
        printf("星期天\n");
        break;
    default:
        printf("选择错误\n");
        break;
    }
    return 0;
}

​​​​​​​

 2.2.3练习
#include<stdio.h>

int main()
{
    int n=1,m=2;
    switch(n)
    {
        case 1:m++;
        case 2:n++;
        case 3:
            switch (n)
            {
                case 1:n++;
                case 2:m++;n++;
                    break;
            }
        case 4:
            m++;
            break;
        default:
            break;
            
    }
    printf("m=%d,n=%d\n",m,n);
    return 0;
}

让我们逐步分析代码的执行过程:
1.初始化整数变量 n 为1,整数变量 m 为2。
2.进入 switch (n),n 的值为1,因此进入 case 1 分支。
3.在 case 1 中,m 的值增加到3,但没有 break 语句,所以继续执行下一个 case。
4.进入 case 2,n 的值增加到2,同样没有 break 语句。
5.接下来,进入 case 3,此处有一个嵌套的 switch 语句。
6.进入内部的 switch (n),此时 n 的值是2。
7.在内部的 switch 中,进入 case 2,n 的值增加到3,然后执行 m++,m 的值增加到4,接着 n++,n 的值增加到4。
8.内部的 switch 没有 break 语句,所以控制流继续流向外部的 case 4。
9.在外部的 case 4 中,m 的值增加到5。
10.switch 结束,没有 default 分支被执行。

11.最后,printf 打印出 m 和 n 的值,即 m = 5, n = 3。

3循环语句

循环语句有3种:

  • while 
  • for
  • do while

 3.1while循环

在上面我们已经学习了if语句的基本知识

当条件满足的情况下,if语句后的语句执行,否则不执行

但是只会执行一次

那么当我们在同一件事需要执行多次,该怎么做呢?

这时,就利用到了循环语句

我们首先学习的是while语句

//while 语法结构

while(表达式)
    循环语句;

while语句执行的流程:

//打印1~10数字

int main()
{
    int i=1;
    while(i<=10)
    {
        printf("%d ",i);
        i++;
    }
    return 0;
}

 

 3.1.1while语句中的break和continue
//break介绍

int main()
{
    int i=1;
    while (i<=10)
    {
        if(5 ==i)
            break;

        printf("%d ",i);
        i++;
    }
    return 0;
}

break在while循环中的作用:

其实在循环中只要遇到break,就会停止后期的所有的循环,直接结束循环。

所以while中的break是用于终止循环的。

continue在while循环的作用是:

continue是用于终止“本次”循环的,也就是本次循环中continue后面的代码不会运行,而是直接跳转到下一次循环,继续判断运行。

3.2for循环

3.2.1语法
for(表达式1;表达式2;表达式3)
    循环语句;

表达式1是初始化部分,用于初始化循环变量的

表达式2是条件判断部分,用于判断循环时候终止

表达式3是调整部分,用于循环条件的调整

int main() 
{
    int i=0;
    for(i=1;i<=10;i++)
    {
        printf("%d ",i);
    }
    return 0;
}

for循环执行流程图:

3.2.2break和continue在for循环的区别

3.2.3for循环和while循环对比

3.2.4for语句的循环控制变量

建议:

1.不可以在for循环体内修改循环变量,防止for循环失去控制

2.建议for语句的循环控制变量的取值采用“前闭后开区间”写法

建议写法:

int main()
{
    int arr[10]={1,2,3,4,5,6,7,8,9,10};
    //0~9
    int i =0;
    for(i =0;i<10;i++)  //不建议将i<10改为i<=9
    {
        printf("%d ",arr[i]);
    }
    return 0;
}
 3.2.5一些for循环的变种
//代码1
//for循环的判断部分省略意味着这判断会恒成立
for(;;)
{
    printf("hello\n");
}

在这个代码中,for循环的初始化部分是一个空语句;;,条件部分也是一个空语句,因此他们都是空的。这意味着初始化、条件判断以及迭代部分都不存在。因此,这个循环将一直执行下去,永远不会停止。

//代码2
int i=0;
int j=0;

//这里打印多少个hello?
for(i=0;i<3;i++)
{
    for(j=0;j<3;j++)
    {
        printf("hello\n");
    }
}

外部的for循环控制变量i从0递增到2,它将执行3次。而内部的for循环控制变量j从0递增到2,它也将执行3次。

因此,内部的printf("hello\n");语句将在外部循环每次迭代时都执行3次。

所以总共会打印3*3=9次。

//代码3
int i =0;
int j =0;

//如果省略掉初始化部分,这里将打印多少个hello?
for(;i<3;i++)
{
    for(;j<3;j++)
    {
        printf("hello\n");
    }
}

首先i=0,说明i<3,此时j=0,j<3,将进入printf

打印完hello后,j++ ->j=1,再次打印第二个hello

然后j++ ->j=2,j<3,再次打印第三个hello

j++ ->j=3,j<3不成立,跳出循环,i++ ->i=1

此时再次进入for-j循环,由于此处省略掉初始化语句,此时j还是3,那么这个循环就不会执行,j<3不成立,跳出该循环

后面就单执行for-i循环

所以只打印3次hello

3.3do...while循环

3.3.1do语句的语法
do 
    循环语句;
while(表达式);
3.3.2执行流程

3.3.3do语句的特点

循环至少执行一次,使用的场景有限,所以不是经常使用

int main()
{
    int i=1;
    do
    {
        printf("%d ",i);
        i++;
    }while(i<=10);

    return 0;
}

3.3.4do ...while 循环中的break和continue

当在C语言中使用do...while循环时,breakcontinue语句可以用来控制循环执行。

break语句:break语句用于立即终止当前的do...while循环,不再继续执行后续的迭代。这通常用于在满足某个条件时提前退出循环。

示例代码:

#include <stdio.h>

int main()
{
    int i=1;

    do{
        if(i==3)
        {
            break;  //当I等于3时,立即退出循环
        }
        printf("%d\n",i);
        i++;
    }while(i<=5);
    
    return 0;
}

在这个示例中,当i的值等于3时,break语句被触发,循环立即终止,不再打印后续的数字。

continue语句: continue语句用于跳过当前迭代的剩余部分,然后继续下一次循环迭代。这通常用于跳过某些特定条件下的迭代,但不终止整个循环。

示例代码:

#include <stdio.h>

int main()
{
    int i=1;

    do{
        if(i==3)
        {
            i++;   //增加i的值以避免陷入无限循环
            continue;  //当i等于3时,跳过本次迭代
        }
        printf("%d\n",i);
        i++;
    }while(i<=5);
    
    return 0;
}

在这个示例中,当i的值等于3时,continue语句被触发,跳过了打印数字3的部分,然后继续下一次迭代。

以上便是C语言的分支语句和循环语句

上述内容有部分借鉴其他博客。

  • 15
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值