速通C语言第二站 一篇博客带你搞定分支循环

系列文章目录

  速通C语言系列

速通C语言第一站 一篇博客带你初识C语言      http://t.csdn.cn/K43IN

 

 感谢佬们阅读支持!


文章目录

  • 系列文章目录
  • 前言
  • 一、分支语句
  •        1 if 语句
  •               单分支、双分支
  •               多分支
  •               悬空else
  •               程序员修养艺术
  •        2 switch语句 
  •               break语句
  •               default语句
  •               continue语句
  • 二、循环语句
  •        1.while循环
  •               while循环中的break语句
  •               while循环中的continue语句
  •        2.for循环
  •               for循环中的break语句
  •               for循环中的continue语句
  •               针对for循环的建议
  •               一些for循环的变种
  •        3.do……while循环
  •               do……while循环中的break语句
  •               do……while循环中的continue语句
  •  三  goto语句 
  •         1 goto语句介绍        
  •         2 goto语句的优缺点
  •         3 实用关机小程序
  • 总结

前言

   上篇博客我们用一篇博客简单的初识了C语言,其中,我们简单地初识了分支循环.

这篇博客我将细致的介绍分支循环的知识点,带大家速通分支循环


一、分支语句

   回忆我们在初识分支循环的例子,分支语句就是一个选择的语句,接下来我们将具体对其介绍。

1 if语句

随着对条件的筛选更加苛刻,if语句的分支会增加。(单分支、双分支、多分支)。

   单分支、双分支

//单分支
if(表达式)
{
   语句;
}
//双分支
if(表达式)
{
   语句;
}
else
{
  语句;
}

多分支 

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

注意:如果你想实现的是条件1满足,条件2也满足;那么要写两个if​​​​​而非if 和else if。

(双分支的)例子:我们定义18岁成年,如果小于18岁,就未成年;如果大于等于18岁,就成年。

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
	int age = 0;
	scanf("%d", &age);
	if (age >= 18)
	{
		printf("成年\n");
	}
	else
	{
		printf("未成年\n");
	}
	return 0;
}

如果我们输入18.

如果我们输入17.


 (多分支的)例子:我们定义小于18岁是少年,大于18岁但小于26岁是青年,大于26岁是壮年。 

#include<stdio.h>
int main()
{
	int age = 0;
	scanf("%d", &age);
	if (age < 18)
	{
		printf("少年");
	}
	else if(age>=18&&age<26)
	{
		printf("青年");
	}
	else
	{
		printf("壮年");
	}
	return 0;
}

如果我们输入17                 如果输入19                                    如果输入27                        

               


 悬空else

悬空else是使用if~else中的一个易错点。在介绍之前,我们先给一个例子。

 下面这段代码会输出什么呢?hehe还是haha?

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

   

 结果出乎意料。什么都没打印。为什么呢?

在分支语句中,else和if的匹配符合就近原则。即else会和离它最近的if匹配。所以在上段代码中,if会和第二个else匹配;第一个if单独构成一个分支语句,它的执行语句是下面的if~else。由于a不等于1,所以就不执行下面的语句,所以就不打印任何东西啦。

 程序员修养艺术

作为一个程序员,我们要养成良好的代码风格。一定要避免写出"悬空else"这种垃圾代码。

那么要如何避免呢?我们可以在写if和else的时候用大括号来包括语句,这样不仅清晰,VS还会自动帮你对齐if和else。


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

我们输入1

 我们想得到星期一,但却打印出了所有星期。


再输入2

 得到了星期二到星期天。


这是为什么呢?

因为他无法跳出来,只能一直执行。

那么如何让它跳出来呢?这就要提到我们接下来要学的break语句和continue语句了。

break语句

我们可以用break来跳出switch语句。

我们将break加入switch语句中。

#include<stdio.h>
int main()
{
	int day = 0;
	scanf("%d", &day);
	switch (day)
	{
	case 1:
		printf("星期一");
		break;
	case 2:
		 printf("星期二");
		 break;
	case 3:
		printf("星期三");
		break;
	case 4:
		printf("星期四");
		break;
	case 5:
		printf("星期五");
		break;
	case 6:
		printf("星期六");
		break;
	case 7:
		printf("星期天");
		break;
	}
}

再输入1

注:在后期学预处理时,有一个预处理指令可以在每个case后自动加上break。


default语句

因为一周只有7天,所以我们只能输入1~7。那么如果输入1~7以外的数字呢?所以我们将其余情况归入default语句。

default:
		printf("输入错误");
		break;


做总结:分支结构中,当分支少时,我们用if~else;当分支多时,我们用switch,但必须用整形表达式。


二、循环语句

1.while循环

while (表达式)
循环语句;

给个例子:打印1~9

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


while循环中的break语句

 与分支语句类似,break也可用在循环中,用于中止循环

我们回到刚才打印1~9的例子。如果我们只想打印1~4,该如何操作呢?

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


while循环中的continue语句

如果将break换成continue,结果会怎样呢?

 后面的光标一直在动,说明得到的是1 2 3 4死循环。为什么呢?

continue的作用是跳过本次循环,直接去下一次判断部分,开始下一次循环。

分析:刚开始打印1 2 3 4没问题,当i等于5时,执行continue,continue会跳过下面的printf和i++;

然后再回到while,由于i小于10且i等于5,所以就会一直循环下去。


2.for循环

在对while循环进行分析时,我们不难发现,while循环分为3部分,初始化、判断部分、调整部分。

#include<stdio.h>
int main()
{
	int i = 1;//(初始化)

	while (i < 10)//(判断部分)
	{
		printf("%d ",i);
		i++;//调整部分
	}
	return 0;
}

由于三者相距较远,所以调整起来比较麻烦。for循环就解决了这个问题。

for (表达式1;   表达式2;   表达式3)
{  //初始化    //判断     //调整
	循环语句;
}

我们尝试用for循环打印1~9

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

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

   


  for循环中的break语句

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

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


  for循环中的continue语句

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

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

由于continue仅能跳过(i==5)的循环,所以打印1~9中除了5的数


针对for循环的建议

1 不可在for循环内修改循环变量,防止for循环失去控制。

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

	for(i=1;i<10;i++)
	{
			printf("%d ",i);
			i = 5;//引起混乱
	}
	return 0;
}

如果不想放在for循环内调整,我们可以将调整部分放到外面。。

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

2 建议for循环的循环控制变量的取值争取前闭后开写法。

//示例
for(i = 0; i < 10 ;i++)
    //闭   //开

  一些for循环的变种

判断部分省略--恒为真

#include<stdio.h>
int main()
{
	for (;;)
	{
		printf("张一钢");
	}
	return 0;
}


初始化的省略

int main()
{
	int i = 0;
	int j = 0;
	for (i = 0; i < 3; i++)
	{
		for (j = 0; j < 3; j++)
		{
			printf("张一钢");
		}
	}
	return 0;
}

3*3=9;所以这段代码是打印9次

 但如果改为

int main()
{
	int i = 0;
	int j = 0;
	for (; i < 3; i++)
	{
		for (; j < 3; j++)
		{
			printf("张一钢");
		}
	}
	return 0;
}

结果就变成了3次

   

结合调试结果分析:当i=0时,进入j所在的for循环中,循环了3次,i++后等于1,但是j已经变成3了,就进不去j所在的for循环了。所以只打印3次。 


3.do……while循环

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

do……while循环的特点是至少执行一次,这个特点在后期我们实现三子棋和扫雷时将会起到作用。

例子:我们还是用这个循环来打印1~9。

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


do……while循环中的break语句

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

相同的,break中止循环,所以打印1 2

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

打印1 2 3 4后,i此时等于5,continue跳过本次循环,i没有++,而是直接跳转到条件判断部分,条件恒成立,于是死循环


三  goto语句 

1 goto语句介绍

简单来说是一个仅能在一个函数内使用,可进行无条件跳转的语句。

理论上讲goto语句没必要使用,但是在一些情况下会十分好用。

其结构为

跳转标识:
 goto 跳转标识;

我们先给一个例子

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

结果会循环打印hehe haha

 当第一次打印hehe和haha后,通过goto语句又回到了flag;所以就再一次打印hehe和haha……所以就成了死循环。


goto语句的优缺点

缺点:可读性太差;而且只能在一个函数使用;而且一般可被替代。

优点:但是遇到多重循环,会非常好用。

例如:

for(...)
{
    	for(...)
		{
			for(...)
			{
				if(disaster)
					goto error;
			}
		}
}
…
error:
if(disaster)

3 实用关机小程序

学编程也要讲究兴趣,下面我们通过实现一个关机小程序来给goto语句提供例子。

(程序运行起来后将在1分钟后关机,如果输入 我是SB 则取消关机)

 相关科普:

在电脑中,用system函数执行系统命令,shutdown -s -t用来设置定时关机,其中-s为关机,-t为设置关机时间。shutdown-a用来取消关机。

关于对字符串的比对,我们不能像常量一样用 ==,而是用strcmp函数,同时需引头文件

string.h

直接上代码:

(带注释版)

​
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main()
{
    char input[] = {0};
    system("shutdown -s -t 60");//设置关机,60代表60秒
//goto语句的标识符
again:
    printf("请注意,你的电脑将在一分钟内关机,输入我是SB,就取消关机\n");
    scanf("%s", input);
    //判断
    if(strcmp(input,"我是SB")==0)
    {
        system("shutdown -a");//取消关机
    }
    else
    {
        goto again;//再给一次机会
    }
    return 0;
}

​

不带注释版

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main()
{
    char input[] = {0};
    system("shutdown -s -t 60");

again:
    printf("请注意,你的电脑将在一分钟内关机,输入我是SB,就取消关机\n");
    scanf("%s", input);
    if(strcmp(input,"我是SB")==0)
    {
        system("shutdown -a");
    }
    else
    {
        goto again;
    }
    return 0;
}​

好啦,快将这段代码分享给朋友吧

 


 

总结

 做总结,我用这篇博客带大家深入了解了分支与循环。每种分支和循环各有优缺点,在不同情况下我们要用不同分支和循环。水平有限,还请各位大佬指正。如果觉得对你有帮助的话,还请三连关注一波。希望大家都能拿到心仪的offer哦。

 

 每日gitee侠:今天你交gitee了嘛?

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值