当前位置:首页 » 《资源分享》 » 正文

C语言大型连续剧(第二集)——当if姑娘碰上三位循环兄弟_教父

11 人参与  2021年05月09日 15:03  分类 : 《资源分享》  评论

点击全文阅读


本节目总导演:rampant boy

本节目总编剧:rampant boy

本节目总策划:rampant boy

本集将重点介绍分支语句和循环语句。下面进入正文:

文章目录

  • 什么是语句?
  • 分支语句(选择结构)
    • if语句
    • 悬空else
  • switch语句
    • switch语句的使用
    • switch语句中的break
    • default子句
  • 循环语句
    • while循环
      • while循环的使用
      • while循环中的break
      • while循环中的continue
    • for循环
      • for循环的使用
      • for循环中的break
      • for循环中的continue
      • for循环的变种
        • 变种一
        • 变种二
    • do...while()循环
      • do...while循环的使用
      • do...while()循环中的continue和break
  • goto语句

什么是语句?

C语言中有一个;(分号)隔开的就是一条语句。

例如:

printf("haha");
3 + 5;
;//空语句

上面所列举的三个例子就是三条语句。

分支语句(选择结构)

if语句

if语句的语法结构为:

if(表达式)
    语句;

如果表达式为真,则执行语句。

在C语言中,非0就是真,0就是假。

一般地,if与else连用,比如:

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

如果表达式为真,则执行语句1,否则,执行语句2。

多分支的情况下:

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

如果表达式1为真,则执行语句1;如果表达式1为假,但表达式2为真,则执行语句2。如果表达式1和表达式2均为假,则执行语句3。

我们可以举一些具体的例子:

int main()
{
    int age = 20;
    if(age >= 18)
        printf("成年\n");
    else
        printf("未成年\n");
    return 0;
}

那么这段代码执行之后结果为:

image-20210423162616231

当把age赋值为10,那么结果为:

image-20210423162652616

如果我们在printf(“未成年\n”)下面再加上一条语句,比如printf(“要好好学习\n”)。同时,我们将age赋值为20,那么此时,这段代码的执行结果应该为:成年。那会不会真的如我们所料呢?我们可以执行来看一看。

image-20210423163112446

这时候,要好好学习也被打印出来了,这是为什么呢?

因为if和else后面只能控制一条语句。如果想控制多条语句,就得加上{}。

例如:

int main()
{
    int age = 20;
    if (age >= 18)
        printf("成年\n");
    else
    {
        printf("未成年\n");
        printf("要好好学习\n");
    }
    return 0;
}

那么当我们再次运行的时候,这段代码只会打印成年。

image-20210423163426086

如果我们将age改为10,那么结果为:

image-20210423163520310

下面我们列举多分支结构的具体例子:

int main()
{
    int age = 60;
    if (age <= 7)
    {
        printf("幼年\n");
    }
    else if (age > 7 && age <= 16)
    {
        printf("少年\n");
    }
    else if (age > 16 && age <= 45)
    {
        printf("青年\n");
    }
    else if (age > 45 && age <= 65)
    {
        printf("中年\n");
    }
    else
    {
        printf("老年\n");
    }
    return 0;
}

那么这段代码的结果为:

image-20210423164653174

注:&&的用法已经在上一集介绍过,这里的age > 7 && age <= 16意思为age大于7,小于等于16。在C语言中,表示age大于7,小于等于16不能写成7<age<=16。

如果写成这样,那么当age赋值为60的时候,这条表达式仍为真。我们可以验证一下:

image-20210423165054321

因为这条语句是这样执行的:age>7,为真,那么age>7的结果为1,而1小于16,所以7<age<=16的结果为真,则执行printf(“少年\n”)。所以最终打印少年

当然,上面这段代码也可以写为:

int main()
{
    int age = 60;
    if (age <= 7)
    {
        printf("幼年\n");
    }
    else if (age <= 16)
    {
        printf("少年\n");
    }
    else if (age <= 45)
    {
        printf("青年\n");
    }
    else if (age <= 65)
    {
        printf("中年\n");
    }
    else
    {
        printf("老年\n");
    }
    return 0;
}

这两段代码所表示的意思是一样的。

悬空else

我们先来看这样一段代码

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

如果我们通过直觉判断,这段代码最后的结果应该是打印haha,那么结果真的如我们所料吗?我们可以验证一下:

image-20210423171550430

我们可以看到,这段代码最终结果是什么都没打印。为什么会这样呢?

因为else与离它最近的if匹配。也就是说,这段代码相当于:

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

因为a不等于1,所以最终什么都没打印。

switch语句

switch语句的使用

switch语句也是一种分支语句,常用于多分支情况。语法形式为:

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

语句项为case语句,形式为:

case 整型常量表达式:
	语句;

我们举个具体的例子,例如我们输入几,那么就打印星期几。具体代码如下:

#include<stdio.h>

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;
}

这段代码就很好的体现了switch语句和case语句的用法:给day赋一个值,例如赋值3,那么就执行case 3后面的语句。我们可以来验证一下:

image-20210424233621470

通过这个结果我们可以知道,给day赋值3,那么代码就会从case 3之后开始执行,直到执行到case 7。也就是说,switch后面的整型常量表达式决定了语句项的入口。但是,我们要的效果是:输入几,就只打印星期几。要想实现这样的结果,就得使用一个关键字——break。

switch语句中的break

break意为跳出,决定了出口,上述代码修改后为:

#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;
}

我们可以来验证一下,例如我们输入3:
image-20210424234602903

那么case后面一定得加break吗?未必,这就得根据需求来决定了。比如:如果我们输入1-5,就打印工作日,输入6-7,就打印休息日。具体代码如下:

int main()
{
	int day = 0;
	scanf("%d", &day);
	switch (day)
	{
	case 1:
	case 2:
	case 3:
	case 4:
	case 5:
		printf("工作日\n");
		break;
	case 6:
	case 7:
		printf("休息日\n");
		break;
	}
	return 0;
}

我们可以来验证一下,例如输入2:

image-20210424235337584

所以case后面的break不是一定得加上的。

default子句

我们使用switch语句的时候可能会出现这种情况:表达式的值与所有的case后面的值都不匹配。这时程序不会终止,也不会报错,因为这种情况在C语言中并不认为适合错误,只是所有语句都被跳过而已。但是,如果我们并不想忽略不匹配的所有语句,那么可以在语句列表中增加一条default子句。格式如下:

default:	
		语句;

当switch表达式的值与所有case标签的值都不匹配的时候,程序就将执行default子句后面的语句。因此,每个switch语句中只能出现一条default语句。但它可以出现在语句列表的任何位置。

例如,还是上述那段代码——输入几,就打印星期几。如果我们加上default子句:

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;
	default:
		printf("输入错误\n");
        break;
	}
	return 0;
}

我们在default子句后面加上了printf(“输入错误\n”),那么当我们输入的不是1—7,那么就会打印输入错误。例如我们输入8:

image-20210425001017671

这就是default子句的使用。

循环语句

while循环

while循环的使用

while循环的语法结构为:

while(表达式)	
	循环语句;

如果表达式的结果为真(非零),那么就执行循环语句;如果表达式的结果为假(零),那么就不执行循环语句。

例如我们用while循环来实现打印1—10,代码如下:

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

我们可以验证一下:

image-20210425001826402

while循环中的break

在while循环中,break用于永久终止循环,例如下面这段代码:

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

这时,当i等于5时,循环就会终止,最终打印结果为1 2 3 4。我们来验证一下:

image-20210425002408961

这就是while循环中break的使用。

while循环中的continue

在while循环中,continue的作用是跳过本次循环中continue后边的代码,直接去判断部分,判断是否进行下一次循环。例如下面这段代码:

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

当i等于5的时候,程序并不会向下执行,打印5,而是会自动转到while(i <= 10)进行判断。所以i就一直为5,这段代码最终就会死循环。我们来验证一下:

image-20210425003125933

光标一直闪,说明程序并未结束,而是死循环。

这就是while循环中continue的使用。

for循环

for循环的使用

for循环的语法形式:

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

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

我们来举一个具体的例子,例如:用for循环打印1—10。具体代码如下:

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

执行结果如下:

image-20210425104845433

在这段代码中,i=1为初始化部分,i<=10为判断部分,i++为调整部分。

那么while循环和for循环的区别在哪?

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

//实现相同的功能,使用for
for(i = 1;i <= 10;i++)
{
    printf("%d ",i);
}

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

for循环中的break

在for循环中,break用于终止循环。
例如下面这段代码:

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

那么最终结果应该是打印1 2 3 4,我们可以来验证一下:

image-20210425111011688

这就是for循环中的break的使用。

for循环中的continue

在for循环中,continue的作用是跳过本次循环中continue后边的代码,直接去调整部分。然后再判断是否进行下一次循环。
例如下面这段代码:

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

那么这段代码的最终结果应该是打印1 2 3 4 6 7 8 9 10。我们来验证一下:

image-20210425111625067

这就是for循环中continue的使用。

for循环的变种

变种一

for(;;)

这种是将三个部分都省略。但当判断部分省略的时候,判断部分恒为真,就会造成死循环。例如这段代码:

int main()
{
	for (;;)
	{
		printf("hehe\n");
	}
	return 0;
}

执行结果为:

image-20210425115159297

这样就会造成死循环。

变种二

for循环中两个变量,例如下面这段代码:

int main()
{
	int x = 0;
	int y = 0;
	for (x = 0, y = 0; x < 2 && y < 5; x++, y++)
	{
		printf("hehe\n");
	}
	return 0;
}

我们可以运行一下:

image-20210425121018303

那么这段代码就说明,for循环的三个部分中是支持有两个变量存在的。

do…while()循环

do…while循环的使用

do…while()循环的语法为:

do
    循环语句;
while(表达式);

先执行一次循环语句,然后再进行判断。如果表达式为真,则再进入循环:如果表达式为假,则跳出循环。

下面我们来举个例子,例如:打印数字1—10。具体代码如下:

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

代码执行结果为:

image-20210430142922227

do…while()循环中的continue和break

do…while()循环中的continue和break与while循环中的continue和break作用相同,这里就不再详细讲解。下面两段代码即为continue和break在do…while()循环中的应用:

image-20210430144624976

image-20210430144649320

goto语句

C语言中提供了可以随意滥用的goto语句和标记跳转的标号。从理论上goto语句是没有必要的,实践中没有goto语句也可以很容易地写出代码。但是在某些场合下goto语句还是用得着的,最常见的用法就是终止程序在某些深度嵌套的结构的处理过程,例如一次跳出两层或多层循环。这种情况使用break是达不到目的的。它只能从最内层循环退出到上一层的循环。

我们举个具体的例子:

int main()
{
	flag:
	printf("hehe\n");
	printf("haha\n");
	goto flag;
	return 0;
}

当然,这段代码是死循环,我们可以运行看一下结果:

image-20210430150949174

如果大家有兴趣,可以看看这篇博客——使用goto语句个性关机。看完之后或许对goto语句有个更深刻的理解。

当然,goto语句真正适合的场景如下:

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

注:goto语句只能在一个函数范围内跳转,不能跨函数

例如:

void test()
{
flag:
    printf("test\n");
}

int main()
{
    goto flag;
    return 0;
}

那么这段代码的执行结果为:

image-20210430231549512

所以,goto语句只能在一个函数范围内跳转,不能跨函数。

本集完!!!

上一集:Hello!C先生

下一集预告:函数帝国的崛起


点击全文阅读


本文链接:http://zhangshiyu.com/post/18687.html

语句  循环  表达式  
<< 上一篇 下一篇 >>

  • 评论(0)
  • 赞助本站

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

关于我们 | 我要投稿 | 免责申明

Copyright © 2020-2022 ZhangShiYu.com Rights Reserved.豫ICP备2022013469号-1