C语言——详谈分支与循环(初学者感到极度舒适^_^)

在学习c将近30天后,我对于c语言的基础的一些知识也有了一些了解,同时加入c站有40多天,也拜读过多位大佬写过的文章,总觉得自己也该行动起来,写一些自己在学习中对c语言的理解。

于是,便有了此篇文章,望一起学习的同学们能现在就开始行动起来。😁👍

目录

分支

if-else

switch

switch多个标签执行一条语句

if-else与switch语句多重镶嵌形式的比较

循环

while语句

for语句

使用continue关键字while与for的区别

do while语句

总结


分支

if-else

首先先大概了解一下if语句的作用。

if语句的通用形式我就不写出来了,因为我想接下来我画的图可能更有帮助

if语句最简单的形式

图画形式:

代码形式:

if(expression)
   statement

表达式为真,执行语句;

表达式为假,按顺序执行后面的代码

if-else 

图画形式:

代码形式:

if(expression)
   statement
else
   statement

 表达式为真,执行下面的语句;

表达式为假,执行else控制的语句。

if语句的上述这两种形式是最常用的,但同时还有一种句式

多重if-else语句镶嵌

图画形式:

代码形式:

if(expression)
   statement
else if(expression)
   statement
else if(expression)
   statement
......
else
   statement

 这是一个多分支的if语句,看起来跟后面要学的switch语句作用类似,但其实它们各有各的优点。

其实上面那些看起来有点长的if语句,我们皆可以看成是一条语句,或者说是一条复合语句

if(expression)
   statement
else
{
   if(expression)
statement
}

//其实跟下面的代码表达效果一样

if(expression)
   statement
else if(expression)
   statement

//因为if语句可以看成是一个看起来很大的复合语句

当然我建议使用第二个写法,因为它更加美观

if语句就讲到这些,用法还是得看实际情况

switch

switch语句是一条多分支语句,跟多重镶嵌的if语句类似,老样子还是先用图画的形式表现出来

图画形式:

代码形式:

switch(expression){
case label1:
     statement
     break;
case label2:
     statement
     break;
case label3:
     statement
     break;
   ......
case labeln:
     statement
     break;
default:
     statement
}

 这里有几个非常要注意的点

1.expression必须是整型表达式,也就是int、short、long、long long、char这几个类型

2.label也就是常量的意思,标签必须是常量,否则会出错

switch的用法比较单一,但是不可否认的是它确实要比if语句的多重镶嵌形式要更加简洁明了,代码可读性也更高

大家可能看到case、break、default这三个关键字,由于这篇文章是详谈分支与循环,我就不多加解释了,只要知道case在这里是检查标签的用处

break是跳出的意思(等下这个重点讲)

default用于处理其他未定义的标签

switch多个标签执行一条语句

有的时候要令一条命令符合多个标签中的任一一个就能输出,那此时我们应该用switch语句怎么去写?(我的语言表达可能不能完全表达我的意思,十分抱歉😣)

图画形式:

 代码形式:

switch(expression){
case label1:
case label2:
     statement
     break;
case label3:
case label4:
     statement
     break;
case label5:
case label6:
     statement
     break;
   ......
default:
     statement
}

当满足label1或label2时第一条语句就会执行

如果要问这是为什么,我们就应该了解到

在switch语句中,当一个标签后的语句执行后,计算机如果没有检查到break以跳出switch语句的话,它会接着向下执行,即使不满足下面的标签,直到遇到一个break或者switch语句执行到结尾

switch(expression){
case label1:
     statement1
case label2:
     statement2
case label3:
     statement3
case label4:
     statement4
}


***********************
如果满足label1标签,计算机会将
statement1、statement2....
都执行

所以在使用switch语句是一定要检擦,是否有漏掉break

除非你是故意的!

if-else与switch语句多重镶嵌形式的比较

要对比这两种多分支语句的适用情景,我举两个例子来更直观的展示

例子一:

假设S市的一个月水费规则如下:

       居民用水不超过5吨,每吨3元

       居民用水超过5吨低于9吨,每吨4.5元

       居民用水超过9吨后,每吨5元

如何知晓某居民一个月水费为多少呢?

通过上面的规则我们可以先列一个方程

设:x为用水吨数,fx为水费

 现在要求我们用代码的形式表现出来,我们应该用那种语句来表现它呢?

是的,只能是if-else的多重镶嵌形式来表现,因为switch语句分支只能判断整数,而不能是一个数的范围

if(x>=0&&x<=5)
    fx=3*x;
else if(x<=9)
    fx=4.5*(x-5)+15;
else
    fx=5*(x-9)+23;

例子二:

如果我们要写一个用户交互的菜单,对用户输入的一个选择进行判定,用哪种形式更好呢

菜单如下

****************************
*     1  进入游戏           *
*     2  选项               *
*     3  设置               *
*     0  退出游戏           *
****************************

用户选择输入{1、2、3、0}其中任一数以供程序判断

那我们该如何设置使用哪种形式呢?

其实都可以,只是用switch更加简洁,且计算机运行更快,当然以我们人的感知来说,这两者的运行速度几乎是没有区别的

两种代码:

//input为int型,接受用户输入
//startgame()实现“开始游戏”功能
//choice()实现“选择”功能
//set()实现“设置”功能

//if-else形式
if(input==1)
   startgame();
else if(input==2)
   choice();
else if(input==3)
   set();
else if(input==0)
   printf("退出游戏");
else 
   printf("选择错误");

//switch形式
switch(input)
{case 1:{
        startgame();
        break;}
 case 2:{
        choice();
        break;}
 case 3:{
        set();
        break;}
 case 0:{
        printf("退出游戏");
        break;}
default :
        printf("选择错误"); //default关键字用于处理其他非法输入
}          

可以清楚看到下面switch句式更清楚美观!

goto语句这个分支语句其实在c中的运用不多,因为它能干的,循环能干,而且更加规范,所以我就不写这个语句了,想了解的话去百度一下(绝对不是因为我懒😗)

循环

while语句

如果你想写一个从一到十依次打印在屏幕上的程序,你该怎么办?

没错,写一个循环!

这是一个从1打到10的循环语句

int i = 1  //从1开始

while(++i<=10)
     printf("%d",i);

***************************
屏幕显示:
1 2 3 4 5 6 7 8 9 10 

​

这是while语句的通用形式

while(expression)
     statement

是否感觉到跟if语句的通用形式相似

只不过if语句中的statement只执行一次

而while却是多次

当然,这里要注意的是一定要给控制表达式进行迭代,否则可能会产生死循环

for语句

for语句可以是看作while语句的加强版,因为在你写下for循环时,它的格式要求你把初始化,测试条件,更新放在一起,这样你写出循环能够尽可能的避免出现死循环的现象

图画形式:

代码形式:

for(initialize;test;update)
     statement

 程序进入for循环,先初始化,然后进行测试

测试的值为真,进入循环

运行一遍,再更新,再测试

循环往复

当然,for()中可以不依初始化,测试.....来写程序

比如说

for(;test;)
    statement

这样写跟单纯的while语句形式上几乎一模一样,可能只是关键字不一样,且多了两个‘ ; ’而已

当然,其他想怎么写都可以(尽量不要太长,否则可读性就不高了)

使用continue关键字while与for的区别

continue关键字用于处理继续循环却不继续运行接下来的代码

while循环使用continue ,如:

while(test_1){
      statement1
      if(test_2)
        continue;
      statement2
}

如果满足test_1,进入循环 ………………步1          

运行statement1……………………………步2

如果满足test_2…………………………….步3

continue,回到test_1,再次循环,statement2就不执行了

for循环使用continue ,如:

for(initialize;test_1;update){
     statement1
      if(test_2)
         continue;
     statement2
}

​

初始化,再进入test_1

值为真,进入循环,执行statement1

如果满足test_2

continue,直接更新,再进行test_2

要说有什么不同的话,只有初始化和更新了

如果说有什么用处的话,看你自己有什么想法喽

在此,我也不多加赘述了

do while语句

这也是一个循环

不过这个循环和上面两个不一样的一点在于

它的测试环节在进行一次循环后

也就是说,不管怎样,只要进入了这个循环,无论如何

循环必定进行一次

图画形式:

代码形式:

do
  statement
while(expression);

 记得do while中while(expression)后必须加‘ ; ’

总结

在此,分支与循环该讲的已经差不多都讲到

读者请注意,goto语句尽量避免使用,它会让你写的代码混乱不堪

同时,我也希望看过此文的诸位能共同进步

文章错误的地方欢迎大家指正

谢谢!

                                                                                                                          作于2022/2/23

                                                                                                                                21:50

  • 5
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值