分支语句和循环语句

人生若只如初见,人的一生中有着很多选择与循环,C语言也一样


前言

这一篇笔记是去理解如何正确的使用C语言中分支语句和循环语句。
分支语句:

  • if
  • switch

循环语句:

  • while
  • for
  • do while

goto语句:


一、分支语句

1.if 语句

if语句的语法结构:

语法结构:
if(表达式) 语句;
if(表达式) 语句1;
else 语句2;
------多分支------
if(表达式1)
语句1;
else if(表达式2)
语句2; else
语句3;

这里说明一下什么是语句:
C语言中由一个分号;隔开的就是一条语句。

if语句代码
#include <stdio.h>
	//代码1 
	int main() {
    int a = 0;
    scanf("%d", &age);
    if(a < 18){
    //输入的数字a,小于18则打印未成年
		printf("未成年\n"); 
	}
	return 0;
}
#include <stdio.h>
	//代码2 
	int main() {
    int a = 0;
    scanf("%d", &age);
    if(a < 18){
    //输入的数字a,小于18则打印未成年
		printf("未成年\n"); 
	}
	else{
	//否则打印成年
		printf("成年\n");
	}
	return 0;
}
#include <stdio.h>
	//代码3
	int main() {
    int a = 0;
    scanf("%d", &age);
    if(a < 18){
    //输入的数字a,小于18则打印未成年
		printf("未成年\n"); 
	}
	else if(a >= 18 && a < 30){
	//又或者,输入的数字大于等于18并且小于30,打印成年
		printf("成年\n");
	}
	else{
	//否则打印白骨精
		printf("白骨精\n");
	}
	return 0;
}

注意:我们之前说过,C语言中非0为真,0为假
而在if语句里,如果表达式的结果为真,则语句执行。

#include <stdio.h>
	int main(void){
    if(3){
        printf("我是真的\n");
    //这里表达式是真,所以打印:我是真的。
	}
    else{
        printf("我是假的\n"); 
    //假如表达式里面为假(0),则会打印:我是假的。   
	}
	return 0;
}

接下来我们看看这种比较特殊的情况

悬空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; 
	//这里因为a = 0没有符合判断条件,所以程序根本没有走进去,没有打印结果
	}

注:else是和离得最近的if匹配
如果想要if或者else控制多个语句的时候,要带{},在这里,一对{}就是一个代码块。如果不带{}默认只能控制一条语句。

小练习:尝试使用if语句来输出1~100之间的奇数(这里会超纲一点用到for)

输出1~100之间的奇数
#include<stdio.h>
int main(){
	int i = 1;
	for(i = 1; i <= 100; i++){
	if(i % 2 == 1)
		printf("奇数:%d ", i);
	}

	return 0;
}

2.switch语句

switch语句也是一种分支语句,常常用作多分支的情况
switch语句的写法

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

注意:swich()跟着的必须是整型常量表达式

这里的语句项指的是一些case语句

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

注意:case后面跟着的必须是整型常量表达式

switch语句中,我们没法直接实现分支,所以需要搭配break使用才能实现分支

switch语句中的break
int main(){
    int a = 0;
    scanf("%d ", &a);
        switch(a)
        {
            case 1: printf("星期一\n");
            case 2: printf("星期二\n");
            case 3: printf("星期三\n");
            case 4: printf("星期四\n");
            case 5: printf("星期五\n"); break;
            case 6: printf("星期六\n"); break;
            case 7: printf("星期天\n"); break;
        }
        //在这段代码中,我们输入几就从case 几进去开始一直执行下去,直到碰到break
        return 0;
}

由此我们可知,case语句的特点:没人阻止它,就会一直执行下去。
break语句的特点:跳出,停止。直接跳出这个switch语句。

这时候可能你会想如果上述代码中,我输入的数字都没有匹配case子句该怎么办呢,这时候我们就需要用到default子句来防止这种现象。
需要注意的是:default子句放在代码块哪里都可以,但我们一般把它放在最后以便阅读。

default子句
//还是上面的代码
int main(){
    int a = 0;
    scanf("%d ", &a);
        switch(a)
        {
            case 1: printf("星期一\n");
            case 2: printf("星期二\n");
            case 3: printf("星期三\n");
            case 4: printf("星期四\n");
            case 5: printf("星期五\n"); break;
            case 6: printf("星期六\n"); break;
            case 7: printf("星期天\n"); break;
            default:printf("输入错误\n");break;
        }
        //在这段代码中,我们输入8时,所有case都不匹配,打印输入错误
        return 0;
}

所以我们编程时应该养成一个好习惯,在每个switch语句中都放一条default子句,甚至可以在后面再加一个break
同时,switch语句也允许嵌套使用。

有了以上的铺垫,我们来看一段代码练习

代码练习
int main(){
	int n = 1;
	int m = 2;
	switch(n){//n为1,从case1开始执行代码
	case 1:m++;//m+1=3,此时m为3
	case 2:n++;//n+1=2,此时n为2
	case 3switch(n){//因为此时的n为2,跳过case1,从case2开始执行代码
		case 1:n++;
		case 2:m++;n++;break;//执行完这行后,m=4,n=3,碰到break,跳出这个switch
		}
	case 4:m++;break;//此时m=4,m++后m=5,碰到break跳出整个switch
	default:break;
	}
	printf("m = %d, n = %d\n", m, n);
	//最终打印结果为m = 5, n = 3
	return 0;
}

二、循环语句

1.while 语句

我们已经掌握了if语句,但这个语句中只会执行一次。可在生活中,我们同一件事往往都需要重复完成很多次。例如:上学,上班,照顾孩子,照顾老婆,睡觉,起床等等…
那在C语言中需要这么做呢?这时候,我们就需要用到while语句实现循环。

while 语法结构
while(表达式){
语句;

那么我们如何理解while语句呢?
举个例子:有一天你不小心惹老婆生气了,老婆让你跪榴莲,你跪啊跪,如此往复循环跪了7749天的时候,你老婆终于才消气原谅你。这就是while语句。
其中:表达式(判断=老婆生气到她消气为止)
语句(不断跪榴莲,跪了7749天)
结果 (终于不用跪榴莲了,因为老婆消气了)

这时候我们用代码来实现一下

while语句实现跪榴莲
#include<stdio.h>
int main() {
    int day = 1;
    while(day<49)//老婆生气了!没跪够49天都没法消气。
    //判断跪的天数是否够49天,不够就一直循环
    {
    printf("跪榴莲的第%d天 ", day);
	day = day+1; //跪一天记录一次
	}
	printf("第%d天老婆终于消气了 \n", day);//终于在第49天老婆消气了
	return 0; 
}

上面代码已经帮我们了解了while语句的基本语法,那我们再来了解一下在while语句中,breakcontinue

先来介绍breakbreak是个和事佬,还是上面的例子,你惹老婆生气后,正在跪榴莲,这时你的女儿替你求情让你别再跪榴莲了,你老婆心软了,你后面就再也不用跪榴莲了。

我们用代码来实现一下场景

"女儿"break求情
#include<stdio.h>
int main() {
    int day = 1;
    while(day<49)//老婆生气了!没跪够49天都没法消气。
    //判断跪的天数是否够49天,不够就一直循环
    {
    printf("跪榴莲的第%d天 ", day);
	day = day+1; //跪一天记录一次
		if(day == 5){
		//这里的第五天,你的女儿替你求情了,此时跳出这个循环
		printf("你的女儿替你求情了!");
		break;
		}
	}
	printf("第%d天老婆终于消气了 \n", day);//终于在第49天老婆消气了
	return 0; 
}

好了,看完以上代码我们来总结一下breakwhile中的作用

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

接下来我们要介绍一下continue了,又是上面的例子,如果说break是女儿的话,那continue就是儿子,儿子来求情作用那可就没女儿大了,假设你老婆生气后让你每天跪完榴莲还要跪键盘,现在你的儿子来为你求情,可是你老婆并没有心软,她只是让你今天跳过了跪键盘这个步骤,隔天还是继续。

这里我们还是用代码来实现一下场景

"儿子"continue求情
#include<stdio.h>
int main() {
        int day = 1;
    	int keyboard = 1;
        while(day<49)//老婆生气了!没跪够49天都没法消气。
        //判断跪的天数是否够49天,不够就一直循环
        {
        printf("跪榴莲的第%d天 \n", day);
            day = day+1;
            if(day == 5){
            //这里的第五天,你的儿子替你求情了,但也只是今天不用跪键盘
                printf("你的儿子替你求情了,你今天不用跪键盘\n");
            continue;
            }
            printf("第%d次跪键盘\n", keyboard);
            keyboard = keyboard+1;
        }
        printf("第%d天老婆终于消气了 \n", day);//终于在第49天老婆消气了
        return 0;
}

综上我们可知:在while循环中,continue的作用是跳过本次循环continue后边的代码,并且直接去判断部分,看是否进行下一次的循环。

在这里我们在补充一个小知识:

getchat(); --从键盘获取一个字符

putchat(); --输出一个字符

EOF – end of file – 文件结束标志

我们利用while来实现一下他们的功能

#include<stdio.h>
int main() {
    int ch = 0;
    //ctrl + z - getchar就读取结束,等于碰到了EOF。
	while((ch = getchat()) != EOF){
		putchar(ch);
	}
	//此时我们从键盘输入什么,就会打印什么,知道判断你按了ctrl + z
	return 0; 
}

ok,知道了getchar的作用,我们再来写一段确认密码的代码

#include<stdio.h>
int main() {
    char password[20] = { 0 };
    printf("请输入密码:");
    scanf("%d", password);//数组的数组名本身就是地址,所以不需要取地址&
    //输入的时候其实是123456\n,带了个\n
    printf("请确认密码(Y/N):");
    //清理缓冲区
    //getchar();//处理'\n'
    //清理缓冲区的多个字符
    int tmp = 0;
    while((tmp = getchar()) != '\n');
    int ch = getchar();
    if(ch == 'Y'){
		printf("确认成功\n");
	}
	else{
		printf("确认失败\n");
	}
	return 0; 
}

总结一下
1、getcharscanf这种叫输入函数,通过缓冲区来获取键盘输入的东西。

2、当有多个字符的时候getchar就会无法处理,此时就需要while循环来取掉缓冲区的\n或者多余的字符。

3、数组的数组名本身是个地址,所以不需要取地址&

最后对于while进行总结
对于while循环语句,我们需要注意到三个重要的点:
1、初始化
2、判断部分
3、调整部分

2.for 循环语句

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

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

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

这里我们先来对比一下for循环和while循环的代码。

for和while的大比拼
#include<stdio.h>
int main() {
    int i = 0;
//实现相同的功能,使用while
    i = 1;//while的初始化部分
	while(i <= 10){//判断部分
	printf("hehe\n");
	i = i + 1;//调整部分
	}
//实现相同的功能,使用for
	for(i = 1; i <= 10; i++){
	printf("hehe\n");
	}	
	return 0; 
}

从以上代码中,我们不难发现,while循环中依然存在循环的三个必要条件,但随着代码的增加,很可能会使得三个必要条件逐渐偏离较远,查找和修改不够集中和方便,所以,for循环的风格利于我们的查找和修改;因此for循环使用的频率也是最高的。

for循环中,break的作用也是用来终止循环的。

for循环中的break
#include<stdio.h>
int main() {
    int i = 0;
    for(i = 1; i <= 10; i++){
		if(i == 5)
			break;
		printf("%d ", i);
	//打印结果为1234
	}
	}	
	return 0; 
}

for循环中,continue是跳到调整部分的。

for循环中的continue
#include<stdio.h>
int main() {
    int i = 0;
    for(i = 1; i <= 10; i++){
		if(i == 5)
			continue;
	//打印结果为1 2 3 4 6 7 8 9 10
		printf("%d ", i);
	//打印结果为1234
	}
	}	
	return 0; 
}

除此之外,我们要防止在循环体内去改变变量,这样做会导致循环体进入死循环。

for里面的初始化部分,判断部分,调整部分,都可以省略。但判断部分的省略会恒为真

for循环的恒为真
#include<stdio.h>
int main() {
    for(; ; ){
		printf("我可是恒为真\n");
		}
	return 0; 
}

当然,我们的for循环也可以内套for循环

for循环的套娃
#include<stdio.h>
int main() {
    int i = 0;
    int j = 0;
    for(i = 0; i < 3, i++){
		for(j = 0; j < 3; j++){
			printf("hahaha\n");
	//这里会打印9个hahaha
		}
	}
	return 0; 
}

上述代码运行的步骤:
1、进入第一层for循环,此时i = 0。
2、i++后i=1,再进入第二层的for循环。
3、进入第二层for循环三次打印三次hahaha后,此时的j=4,不符合判断条件,并跳回去第一层for循环。
4、此时第一层for循环的i=1,并再次进行步骤2和3(此时的i为1,i++后为2)。
5、如此反复三次后,打印出来为9个hahaha。

有了以上的了解后,那如果我们把for循环里面的初始值省略掉会如何呢?

#include<stdio.h>
int main() {
    int i = 0;
    int j = 0;
    for( ; i < 3, i++){
		for( ; j < 3; j++){
			printf("hahaha\n");
	//这里会打印3个hahaha
		}
	}
	return 0; 
}

上述代码运行的步骤:
1、当i = 0的时候,进入内层的for循环
2、内层的for循环打印3个hehe后,j = 3
3、j = 3的时候,返回到外层for循环
4、此时返回到外层for循环的j = 3
5、j = 3的时候条件不成立进不去内层for循环
6、外层for循环重复三次后,停止了循环

所以,我们在写for循环的时候,也不要随意省略初始值

2.循环语句 do while

do语句的语法:

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

do while语句的特点:循环至少执行一次,使用场景有限,并不是经常使用。

#include <stdio.h>
int main() {
	int i = 1; 
	do{
     	printf("%d ", i);
        i++;
    }while(i<=10);
    //打印结果为1 2 3 4 5 6 7 8 9 10
	return 0; 
}

do while语句中因为continue使用不当导致死循环的情况

#include <stdio.h>
int main() {
	int i = 1; 
	do{
     	if (i == 5);
        continue;
        printf("%d ", i);
        i++;
    }while(i<=10);
    //打印结果为1 2 3 4 死循环。
	return 0; 
}

因为do while语句的特点:循环至少执行一次,所以在continue跳过后面的判断部分后,do依旧执行了代码,并一直卡在了if处导致了死循环。


总结

分支语句和循环语句在C语言中出现的频率很高,所以需要更多的了解并掌握如何运用,下一篇笔记将会做一些练习以加强理解。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值