C语言详解——分支与循环语句与go to语句

🐒博客名:苏sir很奈斯

📚学习格言:别人可以拷贝我的模式,但不能拷贝我不断往前的激情

56ff5880026d4a218cca2d0c192044c3.gif

1.什么是语句

C语句可分为以下五类:
1. 表达式语句
2. 函数调用语句
3. 控制语句
4. 复合语句
5. 空语句
这篇博客讲解的是控制语句。
控制语句用于控制程序的执行流程,以实现程序的各种结构方式(C语言支持三种结构:顺序结构、选择结构、循环结构),它们由特定的语句定义符组成,C语言有九种控制语句。
可分成以下三类:
1. 条件判断语句也叫 分支语句:if语句、switch语句;
2. 循环执行语句:do while语句、while语句、for语句;
3. 转向语句:break语句、goto语句、continue语句、return语句。

2.分支语句

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

2.1if语法结构


if(表达式)
   语句;
if(表达式)
   语句1;
else
   语句2;
//多分支    
if(表达式1)
   语句1;
else if(表达式2)
   语句2;
else
   语句3;

注意:else ...... if不能单独出现,必须结合if,多重if中的else - if没有上限,写多少都可以, 多重if中的else可写可不写,根据需求是否书写。

代码演示:

//代码1单分支
#include <stdio.h>
int main()
{
 int age = 0;
    scanf("%d", &age);
    if(age<18)
   {
        printf("未成年\n");
   }
    else
   {
        printf("成年\n");
   }
return 0;
}
//代码2多分支
#include <stdio.h>
int main()
{
 int age = 0;
    scanf("%d", &age);
    if(age<18)
   {
        printf("少年\n");
   }
    else if(age>=18 && age<30)
   {
        printf("青年\n");
   }
    else if(age>=30 && age<50)
   {
        printf("中年\n");
   }
    else if(age>=50 && age<80)
   {
        printf("老年\n");
   }
    else
   {
        printf("老寿星\n");
   }
    return 0;
}

2.2 if中的赋值

如果表达式的结果为真,则语句执行。
在C语言中如何表示真假?
0表示假,非0表示真。
代码演示:
#include<stdio.h>
int main()
{
	int a = 0;
	scanf("%d", &a);
	if (a = 1)
	{
		printf("a为真");
	}
	else
		printf("a为假");
	return 0;
}

c2f2208e640c455888b553ec333afcd9.png

 注:当我们输入大于1的值,if语句判断为真,则打印真,否则a为假。

 2.3悬空else

注:悬空else的意思是书写代码风格的问题

 我们来看看不好的代码风格容易造成的误解

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

注:这里会让人误以为如果if(a==1)不成立,则就打印haha。其实这个else是就近原则,对应的是if(b==2)这个if语句,而不是对应if(a==1)这个语句.

改正 :

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

注:

1. 适当的使用{}可以使代码的逻辑更加清楚。  

2.代码风格很重要

2.4 switch语句

switch语句也是一种分支语句,常常用于多分支的情况。
如果认为使用if......else语句过于麻烦,我们就可以选择使用swiotch语句。
语法结构:
switch(整型表达式)
{
    语句项;
}


//而语句项是什么呢?

//是一些case语句:
//如下:
case 整形常量表达式:
    语句;

2.4.1 switch语句中的 break

在switch语句中,我们没办法直接实现分支,搭配break使用才能实现真正的分支。

代码演示:

#include <stdio.h>
int main()
{
    int day = 0;
    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:       //这里的default可以放在break语句中的任意位置
            printf("选择错误");
            break;
   }
    return 0;
}

注意:这里的Switch的括号里面只能放入整型表达式。如果放入浮点型或者其他形式,编译器会报错。而case只能放入整型常量表达式,如果放入变量,编译器也会直接报错。break语句是指退出循环,或退出分支的语句。default语句指的是执行在上述case情况没有包含的所有部分。



3.循环语句


3.1while循环

我们已经掌握了,if语句:
当条件满足的情况下,if语句后的语句执行,否则不执行。
但是这个语句只会执行一次。
由于我们发现生活中很多的实际的例子是:同一件事情我们需要完成很多次。
那我们怎么做呢?

C语言中给我们引入了: while 语句,可以实现循环

//while 语法结构
while(表达式)
 循环语句;

实现代码演示:在屏幕上打印1-10个数字

#include <stdio.h>
int main()
{
 int i = 1;
 while(i<=10)
 {
 printf("%d ", i);
 i = i+1;
 }
 return 0;
}

 注:这里的代码是如何执行的呢?

1.i=1进入while括号里的判断条件,如果符合括号里的判断条件,则进行while循环。

2.循环到不满足这个循环条件的时候则退出循环。

 3.2while语句中的breakcontinue

 代码演示:break在while循环中的运用

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

这里代码的输出结果是:  1 2 3 4

总结:

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

continue介绍

代码演示:

#include <stdio.h>
int main()
{
	int i = 0;
	while (i < 10)
	{
		i = i + 1;

			if (i == 5)
				continue;
		printf("%d ", i);
	}
	return 0;
}

这里代码的输出结果是:1 2 3 4 6 7 8 9 10

总结:

continue在while循环中的作用就是:
continue是用于终止本次循环的,也就是本次循环中continue后边的代码不会再执行,
而是直接跳转到while语句的判断部分。进行下一次循环的入口判断。

3.3  getchar和 putchar的应用

代码演示:

#include <stdio.h>
int main()
{
 int ch = 0;
 while ((ch = getchar()) != EOF)
       putchar(ch);
    return 0;
}

 注:

1.这里的getchar()和putchar是跟scanf和printf分别对应,但是getchar和putchar只适用与字符类型的输入输出,而scanf和printf适用于任何的数据类型的输入输出。

2.利用一个while循环让getchar不等于EOF,当getchar读取到一个字符时进入循环,实现多组输入字符,将getchar输入的字符给ch。而getchar的括号里面是不用放入参数的。

3.putchar接收ch的值后进行输出

 3.3.1  getchar工作原理

代码演示:

94ec6bd1661443ef9a2734f2880da956.png

 这里为什么我还没输入字符Y。就直接确认失败了呢?其实这个代码是有一点小小的问题的。

d4663d78ce7846a4b3fd95dec2ad9d18.png

 注:

1.我们从键盘输入密码的时候,编译器会将这个密码放入输入缓冲区

2.而后我们输入密码123456的时候,编译器后面会自带一个\n,scanf只会获取到123456这个密码字符,而在输入缓冲区会残留一个\n的字符,所以在输入请确认密码那里,编译器会将输入缓冲区的\n进行输入,则输入的不是字符Y,则就自动打印确认失败。

代码改进:

#include <stdio.h>

int main()
{//这个password数组名原本就是地址所以不用取地址符号
	char password[20] = { 0 };
	int ch = 0;
	printf("请输入密码:>");
	scanf("%s", password);//假设输入123456
	//清理\n- 清理缓冲区
	while (getchar() != '\n')
	{
		;
	}
	printf("请输入密码(Y/N):>");
	ch = getchar();
	if (ch == 'Y')
		printf("确认成功\n");
	else
		printf("确认失败\n");

	return 0;
}

 ac9961ec41774191a16c65edfe8dc7f0.png

 注:

这里我们再进行输入123456密码后面的其他字符的话,就可以利用while循环中的getchar将 xxx\n(空格也属于一个字符)进行清理。

3.4  for循环 

我们已经知道了while循环,但是我们为什么还要一个for循环呢?
首先来看看for循环的语法:

3.4.1  for循环语法

fb87da055ff54c7b8c11504e07d8c98d.png

表达式 1
表达式1为 初始化部分,用于初始化循环变量的。
表达式 2
表达式2为 条件判断部分,用于判断循环时候终止。
表达式 3
表达式3为 调整部分,用于循环条件的调整。
代码演示:使用for循环打印1-10的数字
#include <stdio.h>
int main()
{
 int i = 0;
 //for(i=1/*初始化*/; i<=10/*判断部分*/; i++/*调整部分*/)
 for(i=1; i<=10; i++)
 {
 printf("%d ", i);
 }
 return 0;
}

3.4.2 breakcontinuefor循环中

我们发现在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;
}
//输出的是1 2 3 4 
//代码2
#include <stdio.h>
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

:这里不同于while循环的实施continue,当i==5时,continue跳出此次循环,但是for循环的i会进行+1;而while循环不进行i++的调整的话,可能会导致死循环。

3.4.3 for循环的变种 

代码演示:

  int i = 0;
    int j = 0;
    //如果省略掉初始化部分,这里打印多少个hehe?
    for(; i<10; i++)
   {
        for(; j<10; j++)
       {
          printf("hehe\n");
       }
   }

注:

1.这里我不进行初始化的话,那么hehe打印的是十个而不是100个;

2.当i=0时,j进行循环了十次,j=9,然后j没有进行初始化,那么当i=1时,j进行++,j没有小于10,所以不进入这个循环,所以就不打印hehe了,所以总共就打印了十次hehe。

#include<stdio.h>
int main()
{
//代码1
for(;;)
{
printf("hehe\n");
}

return 0;

}


注:for循环中的初始化部分,判断部分,调整部分是可以省略的,但是省略判断部分,判断就恒为真容易导致死循环。所以不建议初学时省略,容易导致问题。

3.5 do ...while 循环 

3.5.1 do ...while循环语法

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

3.5.2   do...while   语句的特点

循环至少执行一次,使用的场景有限,所以不是经常使用。

#include <stdio.h>
int main()
{
 int i = 1;
 do
 {
 printf("%d ", i);
        i=i+1;
 }while(i<=10);
 return 0;
}

注:由于使用场景有限,很少使用,不加以深入介绍,就就用一个实现代码进行理解。

3.6  go....to 语句

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

代码演示:

#include<stdio.h>
int main()
{
	flag:
	printf("hehe\n");
	goto flag;
	return 0
}

 

注意:

1.代码执行流程是先打印一遍hehe,然后往下执行遇到goto falg,然后就跳转到falg,继续打印hehe,这样就导致了死循环。

2.当我们代码多了以后,使用goto语句容易打乱代码逻辑,特别容易出错;

3.并且goto语句只能再同一个函数内部进行跳转,不能够跨函数跳转;

 goto语言真正适合的场景如下:

#include <stdio.h>
#include<stdlib.h>
int main()
{
    char input[10] = {0};
    system("shutdown -s -t 60");
again:
    printf("电脑将在1分钟内关机,如果输入:我是猪,就取消关机!\n请输入:>");
    scanf("%s", input);
    if(0 == strcmp(input, "我是猪"))
   {
        system("shutdown -a");
   }
    else
   {
        goto again;
   }
    return 0;
}

注意:小编提醒一下大家哦!!!不要轻易将这个代码放到编译器里运行,不然可能会出现大大滴惊喜哦╰(*°▽°*)╯

好了小编的分享到此结束,欲知后续,等待更新!!!! 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

平凡的小苏

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

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

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

打赏作者

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

抵扣说明:

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

余额充值