【C语言必经之路——第4节】分支语句、循环语句、转向语句

目录

一、控制语句及其分类

二、分支语句

1、if语句 

(1)、if语句的结构介绍

(2)、悬空else

2、switch语句 

(1)、案例引入

(2)、switch语句的结构

(3)default子句在switch语句中的作用

 三、循环语句

1、while循环

(1)、while循环的执行流程

(2)、while循环中break的作用

(3)、while循环中的continue 

 2、for循环语句

(1)、for循环的执行流程图

(2)、for循环的语法

(3)、for循环中break和continue的作用 

(4)、for循环的省略(变种)

3、do...while()循环

(1)、do...while()循环的语法

(2)、do...while()循环的执行流程图

(3)、 do...while()循环中break和continue的作用 

四、转向语句

1、goto语句

2、return语句


一、控制语句及其分类

控制语句用于控制程序的执行流程,以实现程序的各种结构方式(C语言支持三种结构:顺序结构、选 择结构、循环结构),它们由特定的语句定义符组成,C语言有九种控制语句。 可分成以下三类:

1. 条件判断语句也叫分支语句:if语句、switch语句;

2. 循环执行语句:do while语句、while语句、for语句;

3. 转向语句:break语句、goto语句、continue语句、return语句。

二、分支语句

1、if语句 

(1)、if语句的结构介绍

//if条件语句 

if(表达式)

        语句;

//if else选择语句

if(表达式)

        语句1;

else

        语句2;

//多分支语句

if(表达式1)

        语句1;

else if(表达式2)

        语句2;

else 

        语句3;

😉补充一下: 

如果表达式的结果为真,则该语句执行,在C语言中0表示假,非0表示真。如果条件成立,要执行多条语句,怎应该使用代码块。如下所示: 

int main()
{
    if(表达式)
   {
        语句列表1;
   }
    else
   {
        语句列表2;
   }
    return 0;
}

(2)、悬空else

浅浅问一下大家下面的两个代码运行结果如何?相同吗?

#include <stdio.h>
int main()
{
    int a = 0;
    int b = 2;
    if(a == 1)
        if(b == 2)
            printf("OK!\n");
    else
        printf("NO!\n");
    return 0;
}
#include <stdio.h>
int main()
{
    int a = 0;
    int b = 2;
    if(a == 1)
   {
        if(b == 2)
       {
            printf("OK!\n");
       }
   }
    else
   {
         printf("NO!\n");
   }       
    return 0;
}

显然第一个代码是没有输出结果的,第二个代码是会输出NO!由上面两个结果可知else是和离资金较近的if相匹配的。所以我们可以适当的使用{ }使代码的逻辑更加清楚,提高可读性😉

2、switch语句 

(1)、案例引入

例如:
输入1,输出星期一
输入2,输出星期二
输入3,输出星期三
输入4,输出星期四
输入5,输出星期五
输入6,输出星期六
输入7,输出星期日
如果写成 if...else if ...else if 的形式太复杂了,这样就有不一样的语法形式。
这就是switch 语句。

(2)、switch语句的结构

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

语句项就是case语句:

case 整形常量表达式:    

        语句;

 对于上方案例可以由switch语句来表达:

#include <stdio.h>
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;
}

换一种情况,周一到周五为工作日输入1-5则输出weekday,周六周日为周末,则输入6/7输出weekend。对应的代码可以这样写:

#include <stdio.h>
//switch代码演示
int main()
{
    int day = 0;
    scanf("%d",&day);
    switch(day)
   {
        case 1:
        case 2:
        case 3:
        case 4:
        case 5:
            printf("weekday\n");
            break;
        case 6:
        case 7:
            printf("weekend\n");
            break;
   }
    return 0;
}

为什么可以只在case:5后面写printf("weekday\n");这是由于switch语句中,运行逻辑是从第一个case语句开始执行,执行完会继续执行第二个case语句,知道遇到break才会跳出switch语句。

(3)default子句在switch语句中的作用

当 switch 表达式的值并不匹配所有 case 标签的值时,这个 default 子句后面的语句就会执行。 所以,每个switch语句中只能出现一条default子句。 但是它可以出现在语句列表的任何位置,而且语句流会像执行一个case标签一样执行default子句。

#include <stdio.h>
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;
        default:
            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;
}

 上面的代码可以看出default的位置在case:3后面,但是只要day不符合所有的case子句,都会运行default子句。而却default的运行流程也是和case相同的,当运行完case:3子句后,如果没有break会继续运行default子句,和case相同。按顺序进行运行。用代码表示如下:

#include <stdio.h>
int main()
{
    int a = 0;
    scanf("%d", &a);
    switch (a)
    {
    case 1:
        printf("houhouhou\n");
        
    case 2:
        printf("heiheihei\n");
      
    case 3:
        printf("hehehe\n");
        
    default:
        printf("输入错误\n");
       
    case 4:
        printf("hahaha\n");
      
    }
    return 0;
}

运行结果可以看出来default的的位置与运行次序是一致的,但是当所有的case都不符,则会运行default子句。同时也可以看出来没有break语句switch里面 会一直从头运行到结尾,而不会结束,所以break咋switch中起着很重要的作用。

 三、循环语句

1、while循环

(1)、while循环的执行流程

 由图可以可看出来,while循环中当条件成立(条件非零)则进入循环,执行循环语句,在进行下次条件判断,当条件为假(条件为零)则结束循环。

(2)、while循环中break的作用

 可以看出来在while循环中只要遇到break,就停止后期的所有的循环,直接终止循环。 所以:while中的break是用于永久终止循环的。

(3)、while循环中的continue 

可以看到输出到4之后不再有输出了,是因为当运行到i加到5就进入了if语句,运行了continue,结束了本次循环进入下一次循环此时i依然还是5所以还是进入if语句,这样就是光标一直闪着,由于i一直是5,没有达到while循环结束,就一直在运行。continue是用于终止本次循环的,也就是本次循环中continue后边的代码不会再执行, 而是直接跳转到while语句的判断部分。进行下一次循环的入口判断

 2、for循环语句

(1)、for循环的执行流程图

int i = 0;
//实现相同的功能,使用while
i=1;//初始化部分
while(i<=10)//判断部分
{
 printf("hehe\n");
 i = i+1;//调整部分
}
//实现相同的功能,使用for
for(i=1; i<=10; i++)
{
 printf("hehe\n");
}

可以看出来在while循环中依然存在循环的三个必须条件,但是由于风格的问题使得三个部分很可能偏离较 远,这样 查找修改就不够集中和方便。所以,for循环的风格更胜一筹;for循环使用的频率也最高。

(2)、for循环的语法

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

        循环语句;

表达式1
表达式1为初始化部分,用于初始化循环变量的。
表达式2
表达式2为条件判断部分,用于判断循环时候终止。
表达式3
表达式3为调整部分,用于循环条件的调整。

(3)、for循环中break和continue的作用 

for循环中也有break和continue控制,他们的意义和在while循环中是一样的。

//代码1
#include <stdio.h>
int main()
{
 int i = 0;
 for(i=1; i<=10; i++)
 {
 if(i == 5)
 break;
 printf("%d ",i);
 }
 return 0;
}
//代码2
#include <stdio.h>
int main()
{
 int i = 0;
 for(i=1; i<=10; i++)
 {
 if(i == 5)
 continue;
 printf("%d ",i);
 }
 return 0;
}

(4)、for循环的省略(变种)

#include <stdio.h>
int main()
{
 //代码1
 for(;;)
 {
 printf("hehe\n");
 }
    //for循环中的初始化部分,判断部分,调整部分是可以省略的。
    
    //代码2
    int i = 0;
    int j = 0;
    //这里打印100个hehe
    for(i=0; i<10; i++)
   {
        for(j=0; j<10; j++)
       {
 printf("hehe\n");
       }
   }
    
    //代码3
    int i = 0;
    int j = 0;
    //如果省略掉初始化部分,这里打印10个hehe,当第一次的j变量的for循环运行结束进行下一次的时候,由于初始化部分被省略,所以j还是10,就跳出循环,直到i变量的for循环结束后,运行终止。但是诗词输出之后就再没有输出了。
    for(; i<10; i++)
   {
        for(; j<10; j++)
       {
 printf("hehe\n");
       }
   }
    
 //代码4:使用多余一个变量控制循环
 int x, y;
    for (x = 0, y = 0; x<2 && y<5; ++x, y++)
   {
        printf("hehe\n");
   }
 return 0;
}

3、do...while()循环

(1)、do...while()循环的语法

do{

循环语句;

}while(表达式);

 do循环中表达式成真则继续运行下一轮循环,当表达式为假,则循环结束

点击进入----->了解复合运算符++的前置与后置的区别

(2)、do...while()循环的执行流程图

 循环至少执行一次

(3)、 do...while()循环中break和continue的作用 

break结束循环,continue结束本轮循环进入到下一轮(几乎所有的循环情况中,这两者的作用都是如此)。

四、转向语句

1、goto语句

goto语句最常见的用法就是终止程序在某些深度嵌套的结构的处理过程。下方举例:

for(...)
  for(...)
 {
    for(...)
   {
      if(disaster)
        goto error;
   }
 }
  …
error:
if(disaster)
    // 处理错误情况

如果不使用goto语句则需要定义一个辅助变量,用break语句依次跳出对应for循环,直到跳出到最外层。效率显而易见的低于goto语句。

但是goto语句属于无条件跳转语句,用于改变语句执行顺序。一旦滥用goto语句将会导致逻辑混乱,导致系统崩溃等问题!!!

2、return语句

int function(int a, int b)
{
	if (a > 0)return a;
	else if (b < 0)return b;
	else  return;
}

return的作用就是结束,跳转:结束本函数,跳转到外函数调用本函数的地方并带回返回值。

今天的分享就到这啦😉


如果我的文章对您有帮助,

请 “点赞” “收藏” “关注” 一键三连哦!

想了解更多知识请前往故里♡927的博客

如果以上内容有什么问题,欢迎留言,大家一起学习,共同进步。


我们下期见😉~~

  • 4
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

故里♡9513

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值