深入理解c语言中的分支和循环语句

上回将分支语句和循环语句的时候我们只是初步认识一下分支和循环是什么,一些简单地使用,而这篇文章我给大家深入讲解一下一些基本的分支语句和循环语句的基本语法。


目录

语句

什么是语句呢?

语句的分类

分支语句

if语句

选择语句种常见错误(符号错误问题1)

选择语句种常见错误(符号错误问题2)

选择语句种常见错误(符号错误问题3)

悬空else

if的书写形式

switch语句

循环

while循环

while循环执行流程

 while循环中的break

 while循环中的continue

get char()

put char()

两者结合使用

getchar和putchar的原理

应用举例

for循环

 for循环的执行流程

for循环中的break

for循环中的continue

总结


语句

什么是语句呢?

在中文和英文中都是一句话,那在c语言中就是一段代码(具体的应该是一个分号;(在c语言中代表一段代码的结束标志))。

语句的分类

空语句


#include<stdio.h>
int main()
{

    while (1)
    {
        ;
    }
    return 0;
}

分号(;)代表一段代码的标志,分号前面什么都没有就为空语句。

分支语句

分支语句包括if语句和switch语句,这里if语句代表单分支语句,switch语句代表多分支语句。

if语句

if语句是指编程语言(包括c语言C#、VB、java、汇编语言等)中用来判定所给定的条件是否满足,根据判定的结果(真或假)决定执行给出的两种操作之一。

if这个我们学英语的人就应该记得应该是如果的意思,在c语言中其实就是一种选择。

我们来看一下if语句的基本语法

1、if(表达式)语句1


	//1、if(表达式)语句1
	if (1)
		printf("我要变大佬\n");

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

  语句2

int i = 0;
	scanf("%d", &i);
	if (5 == i)
	{
		printf("学好c语言\n");
	}
	else
	{
		printf("我要变菜鸟\n");
	}

if(表达式1)
        语句1
    else if(表达式2)
        语句2
    elseif
        .
        .
        .
    
    else
        语句


	int i = 0;
	scanf("%d", &i);
	if (5 == i)
	{
		printf("学c\n");
	}
	else if(6 == i)
	{
		printf("学java\n");
	}
	else
	{
		printf("学Python\n");
	}

其中表达式为真则执行语句假则不执行(0表示假,1表示真)。

选择语句跟我们在生活中是一样的,一个人只能有唯一的一个选择

c语言中选择语句只能执行1个语句不能同时执行多个语句。

选择语句种常见错误(符号错误问题1)

#include<stdio.h>
int main()
{
	int age = 0;
	scanf("%d", &age);
	//方法一
	if (age >= 0 && age <= 16)
	{
		printf("青少年\n");
	}
	//方法二
	if (0 <= age <= 18)
	{
		printf("青少年\n");
	}
	return 0;
}

大家说方法一正确还是方法二正确呢?

显然是方法一

方法二在执行的时候先执行左边在执行右边但是如果左边为假则这个if语句就为假不执行,不能达到我们想要的结果。所以在用这样的符号时候请记住第一种方法

选择语句种常见错误(符号错误问题2)

=与==的问题

在if语句尤其是判断的过程中我们经常将==写成=,这里的=表示赋值,==表示相等(在if语句中是判断)

会出现哪些问题呢?

#include<stdio.h>
int main()
{
	int i = 0;
	scanf("%d", &i);
	if (i = 1)
	{
		printf("学习");
	}

	return 0;
}

 这里的结果就不是我们想要的,这里的意思就是表达式为4(非0)为真则执行语句

正确的:

#include<stdio.h>
int main()
{
	int i = 0;
	scanf("%d", &i);
	if (i == 1)
	{
		printf("学习");
	}

	return 0;
}

所以我们给大家提个建议我们在写if里的表达式的时候我们要写成数字==变量这样我们就不会出错,如果你写成了=他就会报错

选择语句种常见错误(符号错误问题3)

#include<stdio.h>
int main()
{
	int i = 0;
	scanf("%d", &i);
	if (i==1)
		printf("学习");
	    printf("学习c语言");
	else
	{

	}

	return 0;
}

这里就会报错

 这里就提醒我们if语句后面如果有多个语句那我们就加上代码块以免出现报错。

一条语句也建议加上代码块。

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

他会打印成什么呢

看打印结果

这里怎么什么都没打印呢?什么情况???

其实这里就是我们常说的悬空else

 我们一般初学看代码都是这样看的a==1,不成立执行else,这句话是没错但是你要搞清楚,到底是哪个if对应的是else,根据打印结果什么也没有执行,这里的语法就是else与跟他里的最近的if是一对,那这就解释通了,a==1;为假直接跳出第一个if语句不执行第二个语句,就结束了。

在这里又给我们提个建议,我们进行if else语句的时候要加上代码块避免出现悬空else。

if的书写形式

if (condition) {
    return x;
}
return y;
//代码2
if(condition)
{
    return x;
}
else
{    return y;
}

这两个代码哪个更好呢??

显然是第二个,虽然意思都是条件成立返回x,不成立返回y,但如果没有告诉你结果你会不会这么说呢,所以第一个代码就会产生歧义,还是用if语句时要加上代码块。

应用

打印1-100之间的奇数

#include<stdio.h>
int main()
{
	//打印1 - 100之间的奇数
	//int i = 0;
	int n = 0;
	for (n = 1; n <= 100; n++)
	{
		if (n % 2 != 0)
		{
			printf("%d ", n);
		}

	}
	//printf("奇数:%d\n", i);
	return 0;
}

switch语句

Switch在一些计算机语言中是保留字,其作用大多情况下是进行判断选择。以C语言来说,switch(开关语句)常和case break default一起使用。

先拿if else语句来实现多分支语句

#include<stdio.h>
int main()
{
	int day = 0;
	printf("请输入你想周几多学一小时\n");
	scanf("%d", &day);
	if (1 == day)
	{
		printf("周一\n");
	}
	else if (2 == day)
	{
		printf("周二\n");
	}
	else if (3 == day)
	{
		printf("周三");
	}
	else if (4 == day)
	{
		printf("周四");
	}
	else if (5 == day)
	{
		printf("周五");
	}
	else if (6 == day)
	{
		printf("周六");
	}
	else
	{
		printf("周天");
	}

	return 0;
}

麻不麻烦,你不麻烦我打的都累,还有个缺点,如果你不小心输入错误,那就都是周天了

所以我们这是引出多分支语句Switch语句

我们先用switch语句实现,然后再来一步一步分析代码

#include<stdio.h>
int main()
{
	int day = 0;
	printf("请输入你想周几多学一小时\n");
	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就打印周一

还记得我们前面讲的关键字么break,这个就是和switch是一对的(break在循环都有应用) 

我们输入break则跳出本次case

#include<stdio.h>
int main()
{
	int day = 0;
	printf("请输入你想周几多学一小时\n");
	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;
}

这时我们就很好的打印出来。前面说if else语句有个缺点就是万一输入错误,他就一直输出else后面的,而我们在switch语句中default,所有的case都不满足,则找default入口;若未找到则退出整个switch语句。所以default只是一个备用的入口,有没有都无所谓

且default在前面任意位置都无影响

#include<stdio.h>
int main()
{
	int day = 0;
	printf("请输入你想周几多学一小时\n");
	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;
}

 我们这里就讲了所有的switch的用法,接着讲一些switch语句需要注意的点。

1:switch语句中case的顺序不唯一,可以调换顺序

2:switch语句中default可以调换顺序不影响。

3:switch语句中default可加可不加,但最好加上;

4:switch语句中输入的数字必须是整形,浮点型不可以

如果是浮点型:

 5:case语句中后面只能是整形常量表达式

如果是浮点型:

 6:其中Switch语句case相当于入口,break是出口,switch语句中输入多少就从哪个case入口进入

7:如果我们想简化代码,怎么简化呢?

#include<stdio.h>
int main()
{
	int day = 0;
	printf("请输入你想周几多学一小时\n");
	scanf("%d", &day);
	switch (day)
	{
	case 1:
	case 2:
	case 3:
	case 4:
	case 5:
		printf("周1-5我都想学\n");
		break;
	case 6:
		printf("周六\n");
		break;
	case 7:
		printf("周日\n");
		break;
	default:
		printf("你不学习咋当大佬呢,再想想\n");
		break;
	}
	return 0;
}

如果case语句中重复且能达到你想要的结果,我们就可以这样进行简化。

应用

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

	switch (n)
	{
	case 1:
		m++;
	case 2:
		n++;
	case 3:
		switch (n)
		{//switch允许嵌套使用
		case 1:
			n++;
		case 2:
			m++;
			n++;
			break;
		}
	case 4:
		m++;
		break;
	default:
		break;
	}
	printf("m = %d, n = %d\n", m, n);
	return 0;
}

我们来看这答案是多少呢

刚开始你n=1,m=1,进入case1,m=2,没有break进入case2,n=2,,又没有break进入case3,进入switch(2),然后进入case2,m=3,n=3,有break跳出循环,进入case4,m=4,有break跳出循环,然后走default再次break,最后返回m,n

所以m=4,n =3

循环

循环有三种分别为for循环,while循环,dowhile循环,但for循环用的最多,其次是while循环,然后是dowhile循环用的最少。

while循环

while循环官方定义:while是计算机的一种基本循环模式。当满足条件时进入循环,进入循环后,当条件不满足时,跳出循环。while语句的一般表达式为:while(表达式){循环体}。

语法:当表达式为真则进入循环,不满足循环表达式则跳出循环。

为什么要引出while循环呢?

应为只有选择语句是不够的,选择语句一次成立只能执行一次,而循环语句能执行多次一直到不成立退出循环。

while循环执行流程

 分析流程:当满足while循环语句表达式条件则执行继续执行,到表达式不成立或者有break则挑出此循环。

应用:打印1——10用while循环

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

我们先将1初始化然后进入判断条件,打印一下然后执行i++,能看出来,治理我们又三个主要条件1,i=1 2,i<=10 3,i++,分别叫做初始化,判断,调整
 

 while循环中的break

如果在while循环会发生什么呢?

还记得switch语句中break是跳出case语句,我们看看whike循环中的

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

	return 0;
}

这个代码结果会是什么呢?

 我们进行调试的时候就会发现当i==5时进入break就会跳出整个循环

总结break的作用

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

 while循环中的continue

都知道continue有继续的意思,那循环中那又会发生什么呢?

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

    return 0;
}

进行调试的时候,我们就会发现当执行continue的时候,直接跳过continue后面的代码直接进行下一次循环如此往复循环,就会看见死循环的效果

 总结

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

while循环中的应用举例(模拟登陆密码)

在讲例子之前我们先讲讲get char()和put char()

get char()

getchar是读入函数的一种。它从标准输入里读取下一个字符,相当于getc(stdin)。返回类型为int型,为用户输入的ASCII码或EOF。

getchar()是stdio.h中的库函数,它的作用是从stdin流中读入一个字符,也就是说,如果stdin有数据的话不用输入它就可以直接读取了,第一次调用getchar()时,确实需要人工的输入,但是如果你输了多个字符,以后的getchar()再执行时就会直接从缓冲区中读取了  。

msdn解释

 跟上面是一个解释,就是接收一个字符,如果接收EOF则终止程序。那EOF是啥呢难道你输入EOF它就会停止么当然不是这里的EOF是代表-1;

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

	}
		return 0;
}

 这样你就会按字符就会输入按到ctrl+z就会结束程序

put char()

putchar语法结构为 int putchar(int char) ,其功能是把参数 char 指定的字符(一个无符号字符)写入到标准输出 stdout 中,为C 库函数 ,包含在C 标准库 <stdio.h>中。其输出可以是一个字符,可以是介于0~127之间的一个十进制整型数(包含0和127),也可以是用char定义好的一个字符型变量。

表达式可以是字符型或整型,它每次只能输出一个字符。例如:“putchar('#')”输出字符“#”。

putchar()和getchar()是一对前者是输出字符后者是输入字符

两者结合使用

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

 这样你输入字符他就会输出字符直到ctrl+z结束程序!

getchar和putchar的原理

getchar可用宏实现:#define getchar() getc(stdin)。getchar有一个int型的返回值。当程序调用getchar时.程序就等着用户按键。用户输入的字符被存放在键盘缓冲区中。直到用户按回车为止(回车字符也放在缓冲区中)。当用户键入回车之后,getchar才开始从stdin流中每次读入一个字符。getchar函数的返回值是用户输入的字符的ASCII码,若文件结尾(End-Of-File)则返回-1(EOF),且将用户输入的字符回显到屏幕。如用户在按回车之前输入了不止一个字符,其他字符会保留在键盘缓存区中,等待后续getchar调用读取。也就是说,后续的getchar调用不会等待用户按键,而直接读取缓冲区中的字符,直到缓冲区中的字符读完后,才等待用户按键。

通俗的说,我们输入一个字符需要经过键盘输入缓冲区,然后就会把我们输入的字符放到缓冲区里直到返回-1(EOF)就结束程序。

应用举例

模拟登录密码


#include<stdio.h>
int main()
{
	char password [20] = { 0 };
	printf("请输入密码\n");
	scanf("%s", &password);
	printf("请确认密码:>(Y/N)\n");
	int ch = getchar();
	if (ch = "Y")
	{
		printf("确认成功\n");
	}
	else
	{
		printf("确认失败\n");
	}

	return 0;
}

但当我们输入的时候会出现,这种情况

 为什么直接确认失败呢我还没有输入,这是因为当我们输入字符确认的时候会按回车(\n),

 getchar直接读取\n然后执行else确认失败那怎么不发生这样的情况呢?


#include<stdio.h>
int main()
{
	char password [20] = { 0 };
	printf("请输入密码\n");
	scanf("%s", &password);
	printf("请确认密码:>(Y/N)\n");
	getchar();
	int ch = getchar();
	if (ch =='Y')
	{
		printf("确认成功\n");
	}
	else
	{
		printf("确认失败\n");
	}

	return 0;

这里的getchar是清理\n,然后就可以输入了

 那如果我们输入abcd 12呢?

 这是因为当我们scanf接收到空格则会不接受后面得字符,那怎样解决呢

#include<stdio.h>
int main()
{
	char input [20] = { 0 };
	printf("请输入密码\n");
	scanf("%s", &input);
	printf("请确认密码:>(Y/N)\n");
	while ((getchar() != '\n'))
	{
		;
	}
	int ch = getchar();
	if (ch =='Y')
	{
		printf("确认成功\n");
	}
	else
	{
		printf("确认失败\n");
	}

	return 0;
}

 这里我们加个循环直到读完最后一个\n则执行下一步代码,这样就可以执行你想得到的结果了

for循环

for循环是编程语言中一种循环语句,而循环语句循环体及循环的判定条件两部分组成,其表达式为:for(单次表达式;条件表达式;末尾循环体){中间循环体;}。

语法:

 还记得上面的while循环younajibufenme没错就是这几个部分,而for循环一句代码就可以解决问题是不方便多了

那我们打印一下1-10的数字吧看看for循环是如何实现的?

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

是不很简便呢

 for循环的执行流程

首先进入for循环然后进行判断部分,执行for循环里面的代码然后再执行i++,接着又回去判断,来回往复,直到判断条件为假则跳出循环。

for循环中的break

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

与while循环一样也是跳出后面循环,终止循环。

for循环中的continue

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

这个就与while循环中的不一样了,这是跳过后面的代码然后继续循环

总结

continue只是终止本次循环,接着还执行后面的循环,break则完全终止循环,可以理解为continue是跳过当次循环中剩下的语句,执行下一次循环。

  • 10
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值