Bootstrap

【初识C语言之分支与循环】

前言

我们仔细回想生活里的事情,可以发现这些事情都会遵循这么一些规律;首先会有一个先后的顺序,先干什么再干什么;有时候还得根据条件来选择后面该干什么,比如满足条件A我就干这件事情,不满足条件A我就干另外的事情;有时呢我们还得需要去重复的干一件事情直达到了某个条件才停止等等。我们大致可以给这些事情归类为:顺序结构、选择结构、循环结构。而C语⾔就是结构化的程序设计语⾔,这里的结构化正好就是这三个结构!我们在使用C语言来描述一件事情该怎么做同样也是遵循这些结构,只是我们的描述还得需要遵循C语言的语法规定。下面我们就进入今天的主题来讲讲什么是分支和循环!

一.什么是分支

什么是分支呢?就像我们走在一条笔直的路上,突然前面出现了两条路;这个时候我们便需要做出选择,哪条路能够满足我们的需求我们便就会走这条路。那C语言里又是怎么来实现分支的呢?C语言里使用if 、 switch 实现分⽀结构。接下来就来讲讲

if语句

if语句的基本语法形式为:

表达式(为真)则执行后面的语句;表达式(为假)则不执行语句。(C语言中规定0假,非0为真)

  • else子句

它需要接在if语句后面,如if语句中的表达式为假就会执行else里的语句。else子句不能单独使用;并不是所有的if语句都需要else,需要看我们的需求,比如一个数,它不是奇数那它就一定是偶数,这个时候就可以使用if...else...语句了。

if...else..语句的基本语法形式为:

我们通过一段代码来了解一下:(判断一个数的奇偶性)

可以看到输入5,5除2余数是1,1不等于0;if语句的表达式为假,所以执行了else后的语句。而我们第二次输入10,10除2余数是0,0等于0;if语句的表达式为真,所以执行了if后的语句。注意if与else后面默认都只能跟一条语句,如果需要跟多条语句需要使用代码快;即使用英文大括号把需要的语句括起来({ }

  • if的嵌套与else的悬空

什么是if的嵌套呢?其实是在if语句或者else子句中又嵌入进去了if语句、或者if...else语句。并且if语句和if...else...语句嵌套在else子句时,if语句可以直接接在else子句的后面,构成多重判断。下面我们通过一些例子来了解一下:

例1:先判断输入是数是否为0,在判断是正数还是负数。

例2:输入一个数,如果大于等于0,就判断它是奇数还是偶数,如果不大于等于0,则判断为负数。

以上就是嵌套if语句的语法,有了嵌套if语句,我们便可以完成更多复杂逻辑的判断。

那什么又是else的悬空呢?其实就是我们在使用if的嵌套时一定需要注意,如果有多个 if 和 else ,可以记住这样⼀条规则, else 总是跟最接近的 if 匹配。相匹配的if...else..语句中if语句跟else子句只会有一个被执行。如我们不希望else与它接近的if匹配,需要使用({ })大括号将它们分隔开。

switch语句

C语言中的另外一个用来实现分支结构的就是这个switch语句,switch 语句其实是⼀种特殊形式的 的if...else 结构,⽤于判断条件有多个结果的情况。使用case子句来替换了多重 else if ;使得可读性更好。

其基本语法形式为:

需要注意:在switch后面括号里的表达式expression,必须是整型表达式;case子句后面的值,必须是整形常量表达式,case子句的数量根据自己的需求来决定;default子句,是在当所有的case子句都匹配不上时就会执行default子句。

switch语句的逻辑是根据表达式expression的不同值,来执行相应的case子句;没有匹配的case子句则会执行default子句。case 和后边的数字之间必须有空格,case只是决定了switch语句的入口,需要让每个case语句都成为单独的分支还需要在每个case子句中加上break。下面我们通过一些例子来看看:

能够发现我们这里以变量day作为表达式,我们输入3赋值给表达式,而第三个case子句的值和表达式的值匹配,所以switch语句以第三个case子句为入口;但是执行完了这个case 3:,并没有跳出switch语句而是把后面的子句都执行了。这里也说明了case子句只是决定了入口,它们还并不是独立的分支。

下面我们给这些case子句都加上break;看看:

可以发现在给每个case子句都加上break之后,它们都形成了独立的分支!那是必须每个case子句都需要break吗?这需要看我们的需求,有时候多个条件为一个分支时就不需要每个case子句都加上break。比如我们需要判断一天是不是周末,则只需要在第五个和第七个case子句里加上break;这样我们输入1-5的数,就会从第5个子句的break跳出,输入6或者7则会从第7个case子句的break跳出。

同时如果我们输入的值没有匹配任何一个case子句,则会执行default子句,我们来看看:

二.什么是循环

循环,从字面意思我们便能知道就是循环往复的意思。生活中我们也常会遇到需要我们循环去做的事情,这些事情往往需要达到了某个条件或许遇到了什么突发情况我们才会停止去做这些事情。那么C语言里又是怎样来描述循环的呢?我们一块来看看!

while循环

while循环是C语言提供的三种循环语句中的一个,程序执行到这些循环语句的时候会反复执行循环体里的内容。

我们来看看while循环的语法:

while后面的(表达式);表达式就是判断条件,满足表达式;表达式就为真就会进入循环,不满足表达式;表达式就会为假就会结束循环。

下面我们来看个例子:打印1到10的数字

可以看到我们利用while成功实现了这个需求;通过调整部分使循环每进行一次就会有相应的变化,直到不满足来判断条件,循环就停下来了。循环体里调整部分、判断条件都是不能缺少的,如果没有调整部分;进入循环之后条件始终不会改变,那么就会一直满足条件;循环就始终不会结束就会陷入死循环。

for循环

for循环是三个循环中使用的最多的一个,其实类似与while循环;for循环将判断部分与调整部分都放在了一块,可以让我们更便捷的掌控这个循环。

for循环的基本语法形式:

表达式1:⽤于循环变量的初始化;表达式2:⽤于循环结束条件的判断;表达式3:⽤于循环变量的调整三个表达式需要用英文的分号(;)隔开

同样我们使用for循环来打印1到10的数字:

可以发现在 for 循环和 while 在实现循环的过程中都有初始化、判断、调整这三个部分,for循环的三个部分更集中,这样便于对进行代码维护,所以在代码较多的时候;从形式上 for 循环要更优⼀些。 

do-while循环

do-while循环的语法形式:

while与for循环进入循环前都会先判断是否满足条件,如果一开始就不满足条件则不会进入循环;然而do-while循环则是会先进入循环体执行循环语句;在第二次才开始判断是否满足条件。所以do-while循环至少都会执行一次循环!

break与continue语句

我们在前面说到过有时候也会因为一些突发事情或者特定条件需要提前结束循环,在C语言里提供了break和continue这两个关键字来满足我们的需求。

  • break 的作⽤是⽤于永久的终⽌循环,只要 break 被执⾏了,就会直接跳出循环,继续往后执行了。
  • continue 的作⽤则是跳过本次循环中continue后面的代码,在while循环和for循环中有所差异。

while循环里的continue是怎样的呢?其实会造成影响的原因是跟调整部分的有关,如果调整部分放在了continue语句的后面,就会被跳过;循环变量没有被改变就会一直满足continue执行的条件,就会导致循环变成死循环。我们通过代码来看看

我们发现循环变量到4就没有输出了,程序其实并没有停下来,只是一直卡在这里了,因为跳过了调整部分,所以执行continue语句的条件一直满足。所以在while循环里使用continue需要注意这样的情况,我们可以在需要执行continue语句之前先对变量做出调整,来避免这种情况。

for循环里的continue也会出现这种情况吗?for循环中continue同样也是跳过本次循环中continue后的代码,但是会跳到循环的调整部分去,所以在for循环里不会出现上面while循环中的情况。

而do-while循环里的continue几乎和while循环一样,我们在使用continue语句时同样也需要对调整部分加以注意,避免循环变成死循环。

循环的嵌套和goto语句

C语言里是允许这三种循环进行嵌套的,这三种循环往往会嵌套在⼀起才能更好的解决问题,我们在将它们组合嵌套在一起时只需理清楚它们之间的逻辑关系就可以了。下面我们通过一个例子来体会一下循环的嵌套。

例如:找出1-100之间素数,首先需要产生1到100之前的数字,然后需要用2到(i-1)之间的数试除i;(素数只能被1和它本身整除)如果这之间有数可以整除i,那这个数就不是素数。    

gote语句是C语言中提供的一种用于跳转的语句;在同一个函数内部,只需设定好跳转到标记,goto语句就能从任意位置跳转到该记号处,让程序从该记号后的代码开始执行。我们来看看这段代码。

我们发现goto语句跳过了其中的一段要输出的话,来到了设定的记号处然后执行记号后面的代码。goto语句的记号名称由自己来命名,并且它还能往回跳;只要在同一个函数内部,记号放在哪里,就会往哪里跳转!所以goto 语句如果使⽤的不当,就会导致在函数内部随意乱跳转,打乱程序的执⾏流程,建议大家能不⽤尽量不去使⽤!不过在多层的循环嵌套中,需要直接跳出循环时;用break只能一层一层的往外跳,这时使用我们的goto语句就能迅速的帮助我们跳出循环!

结语

到这里我们这次的内容就讲完了,如果有之前对C语言里的分支跟循环不咋了解的朋友们你们现在对它们有了一定的了解了吗?这里非常感谢大家的阅读,如果对您有些许的帮助;还请您给个赞呀,小编将继续努力学习,争取给大家带来高质量的文章。如果有讲的不对的地方还请麻烦指正,再次感谢您的阅读!

;