Bootstrap

史上最强C语言教程----分支和循环(1)

目录

前言

课前准备

内容总览:

1.什么是语句?

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

2.1if语句

2.1.1 悬空else

2.1.2if书写形式的对比


前言

对于一个C语言菜鸟来说,说出这些话无疑是大言不惭的,但我有信心也有能力为大家讲好C语言,系统的带大家入门C语言,也希望大家能够相信我,支持我,在接下来的几个月中,我会持续更新这个系列,当然,我的笔记也会同步更新的,感谢大家的支持!如果觉得内容还不错的话,点一个小小的赞和支持吧!

课前准备

内容总览:

分支语句

if

switch

循环语句

while

for

do while

相信大家都听说过一句话是:C语言是结构化程序设计语言,但是为什么这么说呢?大家想一下我们生活中做一件事,有三种情况,语言表示呢,不是很好表示,先给大家画图表示一下!

 这个图画得确实不是很好,但我觉得大家应该能了解到我的意思,这三种做事或者解决问题的方法,也分别对应着C语言中的三种结构(不得不感叹最初编程设计语言的抽象概括能力),这个地方需要告诉大家,C语言中也只有这三种结构,而我们今天讲的也就是分支和循环语句,对应的也就是分支和循环结构,那么我为什么不讲顺序结构呢?

因为在计算机中,在没有分支和循环结构参与的情况下,所有的程序都是默认的顺序结构,即程序是顺序执行的,所以顺序结构并没有讲的必要,同时,顺序结构也是我们能够进行程序编程的基础所在,也是计算机的基础内在逻辑所在,从某种程度上讲,在进行分支和选择结构的过程中,也同样在进行着顺序结构。

1.什么是语句?

C语言语句可分为以下五类:

(1)表达式语句(例如 y=x+3;假设变量y和x均已定义)

(2)函数调用语句(MAX(x,y);假设函数MAX()已经定义)

(3)控制语句

(4)复合语句(把多种语句复合在一起形成的语句)

(5)空语句(例如 ;分号本身就可以作为一条语句,称为空语句,至于空语句的作用,后续会讲到 )

无论上述哪一种语句,都必须以分号结束!

今天介绍的分支和循环语句就是控制语句。

控制语句用于控制程序的执行流程,以实现程序的各种结构方式,它们由特定的语句定义符组成,C语言有九种控制语句。

可分成以下三类:

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

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

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

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

你遇到了你喜欢的女生,如果你表白了,她成了你的女朋友,你和她在一起了;

如果你没有表白,她成了别人的女朋友,你看着她躺在别人的怀里,后悔莫及。

这就是选择!

 

 当然,也有多分支选择,如果你表白成功了,她成了你的女朋友;相反,如果你表白失败了,她说:你是个好人,如果你压根就没有表白,那她最终还是成为了别人的女朋友。(遇到喜欢的人就要勇敢表白哦!!)

2.1if语句

那if语句的语法结构是怎么样的呢?

if()括号中的表达式如果为真,就执行后面的语句;如果为假,就不执行后面的语句,去执行else后面的语句,那么什么是真?什么是假呢?

C语言规定,0为假,非0为真。

下面就代码给大家演示一下吧!

首先是单分支的情况:

然后是双分支的情况:

 接下来是多分枝的情况:

哎,很多同学们看到这就想问了,多分支情况下后面的条件判断是不是不写前面的age>=18也是可以的呢?很明显当然是可以的,因为前面不满足age<18的时候此时age是一定大于18的了,那么此时按照道理来说,我们不写age>=18也是没有问题的,但这个地方,推荐同学们还是要加上的,为什么呢?我们将来写代码,不仅仅是给自己看的,也是要给别人看的,加上之后,条理就很清晰明了,方便别人查看的同时,也有利于我们后期的维护与调试。

看到这,相信同学们也会有这样的疑问,就是我们在写条件表达式(age>=18&&age<60)的时候可不可以这样写呢?(18<=age<60)相信大家会有这样的疑问,其实有这样的疑问也是正常的,因为我们在数学中就是这样写的,但这样写到底行不行呢?我们直接代码走起!

 

在同学们看到第一张图的时候,哎,感觉没问题啊,但看到第二张图的时候,出问题了!为什么会出现这种问题呢?接下来呢,我给大家分析一下! 我们知道,>    >=    <    <=  == ,这些运算符都是关系运算符,如果结果为真,就返回1,如果结果为假,就返回0,并且结合方向是自左向右(有关于运算符的结合方向,我会把各种运算符的结合方向以图片的形式在本篇文章的最后分享给大家),在第二个例子中,我们输入了100,首先对第一个if后面的表达式进行判断,很明显,100>18,不满足条件,接下来进入了第一个else if语句进行判断,18<=100,是真的,返回1,然后1<60,是真的,最终,返回1结果是成立的,所以会输出“青年”,相信大家看到这就明白了,在计算机中是不可以这样写的,虽然语法上没有问题,但逻辑上却无法正确表达我们的意思,无法满足我们的要求,所以不要这样使用

看到这很多同学们又有问题了,那我们在if()的后面直接跟一个变量是不是也是可以的呢?是的,完全没有问题!因为上面已经说了,c语言规定,0为假,非0为真,所以在if()后面直接跟变量是完全没有问题的!如果变量值为非0,那么判断结果为真,就执行后面的语句,如果变量值为0,那么判断结果为假,就不执行后面的语句。

同时在这给大家顺便提一下,赋值表达式的返回值是赋的值本身,即if(i = n)中(n为常数),如果n为0,那么返回值为0,如果n为非0,那么返回值为n,即返回值为非0,为真,会执行后面的语句,同时告诉大家,printf和scanf函数也是有返回值的,小伙伴们课下可以自己去查一下哦!

如果大家想对if有更深入的了解的话,就可以看我另一篇有关于if的博客,那篇文章对if有个比较深入的探究!

如果条件成立,要执行多条语句,则应该使用代码块!事实上,我前面就全部都使用代码块了,那么什么是代码块呢?C语言中,被{}括起来的叫做代码块,接下来给大家代码展示一下,如果不用{}会怎样!

 

大家都看到了,如果我们想在if后面跟多条语句的话,我们不用{}就会出错,这是由C语言语法本身所决定的,因为这样的话,后面的else就没有匹配的if了,默认情况下,if后面只能跟一条语句,而计算机把{}内的语句当作一条语句,所以我们如果if后面想跟多条语句的话,就要用{}括起来形成一个语句块

简单给大家代码展示一下:

 我给大家的建议呢。就是无论后面跟的是几条语句,我们都加上{},为什么这么说呢,第一个原因就是避免我们在if后面跟多条语句时可能会忘了加{};第二个原因是就代码块更加简洁有条理;第三个原因就就是以后方便我们以后再向里面添加代码。

2.1.1 悬空else

下面给大家一段代码,希望大家能够给出输出的结果!

相信大家有人会给出"hehe" 的输出结果,也会有人给出"haha"的输出结果,当然也有人会给出一些其它的结果,大家都各有各的想法,这并不会让人意外,那我告诉大家,输出结果是空白,大家会感到意外吗?大家可能会觉得我说的是假的,那我就给大家代码展示一下!

没错,输出结果确实是空白,这个结果确实让人感到意外,这个题中我们需要学习的知识点是,else总是跟最近的If进行匹配! 

该如何理解这句话呢?我们就以下面这段代码为例给大家解释一下吧!

首先只看这张图的话,很容易让人误解后面的这个else会跟if(a==1)进行匹配,但是我们应该记住else符合就近原则,即总跟最近的未配对的if进行匹配,从这个else向前找前面的if语句,首先找到的一个未配对的if语句是if(b==2),相信大家清楚了这个这个就不难理解了,下面给大家展示一下代码的本来面目!

看到这大家应该都能理解了吧,首先对if(a==1)进行判断,不成立,然后后面的if(b==2)与else语句均不执行了,我们可以这么理解:if和else组成的是一个语句 。

实际上,这个代码我们还能够去改进一下,使这个代码变得更加的清晰,更加的方便我们的理解:

这样加上一个代码块是不是更有助于大家的理解了呢? 所以代码规范很重要!

这个地方呢,希望大家能够养成良好的代码书写风格,使代码美观、符合规范、并且容易理解!在这给大家推荐一本书,叫《高质量的C-C++编程》,里面有很多良好的代码书写风格还有一些好的习惯,大家可以去网上找一找,应该使可以找到电子版的,如果有时间,我也会根据书上的内容写一些相关的博客!如果大家实在找不到,就在评论区告诉我,我会分享在评论区的。

2.1.2if书写形式的对比

首先大家看代码1和代码2,它们表达的意思是完全一样的,就是如果condition条件成立,就执行return x;语句返回x,反之不成立就执行return y;返回y,但是代码块2表达意思就比代码块1更容易理解,逻辑也更加的清晰,希望大家在写代码的时候能像代码2一样这样写!

//代码1

if (condition) {
    return x;
}

return y;

//代码2

if(condition)
{
    return x;
}

else
{
    return y;
}

//代码3

int num = 5;

if(num == 5)
{
    printf("hehe\n");
}

//代码4

int num = 5;

if(5 == num)
{
    printf("hehe\n");
}

接下来大家看代码3和代码4,它们表达的意思是完全一样的,那我为什么还要给大家讲这个点呢?是因为老是有很多同学在写if(num==5)使写成了if(num=5),注意虽然前后两者的结果是一样的(后面表达式是否执行),但它们所表达的意思却是完全不同的,前者是进行判断,而后者是进行赋值,执行完这条语句之后,前者的num的值并没有发生任何改变,而后者无论原先num的值是否为5,在执行完if(num=5)之后,num的值都将变成5。

它们的判定结果确实是一样的,为什么呢?前面已经给大家说了,赋值表达式的返回结果是所赋的那个值,在第二个语句中赋的值为5,所以返回值为5,是非零的数,为真,而前者因为num本身就等于5了,所以判定结果为真,两者都为真,均执行后面的语句。

这两种写法第二种虽然是错误的,但结果确是正确的,但所造成的后果却是截然不同的,希望大家能够注意!

然后给大家讲讲为什么我要给大家展示代码3和代码4,按照我们正常的逻辑来说,我们应该会像代码3这样写,但前面已经给大家说了,代码3这样写我们会很容易写成if(num=5),从而改变了变量的值,那为什么要写成代码4这样呢?就是为了避免犯这样的错误!给大家代码展示一下大家就明白了!

 

 在这种情况下,如果我们还是按照错误的方法去写,很明显程序就报错了,为什么会报错呢?我们只能给变量赋值,即我们书写赋值语句的时候,=左边必须是变量,而不能是常量!这样编译器一旦提示我们程序错误,我们一检查,就知道自己又犯了老错误,就能及时更正过来!所以推荐大家在写if()里面的条件判断表达式时,将常量放在关系运算符的左边!

好了,今天的分支和循环(1)就到这了,如果大家觉得不错的话,点个小小的赞和关注吧,后面还会持续更新哦!

给大家分享的操作符结合性顺序表:

 

 

 

;