分支与循环语句

分支与循环语句

一.分支语句

1.if语句:

(1)if语法结构:

语法形式:

if(表达式)
    语句

在C语⾔中,0为假,⾮0表⽰真,也就是表达式的结果如果是0,则语句不执⾏,表达式的结果如果不是0,则语句执⾏。

例:如果大于等于140,则表明他是一个天才,输出“Genius”。

#include <stdio.h>
int main() 
{
    int a;
    scanf("%d",a);
    if(a>=140)
    {
        printf("Genius");
    }
    return 0;
}

(2)else语法结构:

语法形式:

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

例1:分数大于等于60分,是输出“Pass”,否则,输出“Fail”。

#include <stdio.h>
int main() 
{
    int a;
    if(a>=60)
    {
        printf("Pass\n");
    }
    else 
    {
        printf("Fail\n");
    }
    return 0;
}

例2:是闰年输出"yes" 否则输出"no"

#include <stdio.h>
int main() 
{
    int n;
    scanf("%d",&n);
    if((n%4==0&&n%100!=0)||n%400==0)
    {
        printf("yes");
    }
    else 
    {
        printf("no");
    }
    return 0;
}

(3)分支语句中包含多条语句:

默认在 if 和 else 语句中默认都只控制⼀条语句,如下:

例:输出该字符是字母(YES)或不是(NO)

#include <stdio.h>
int main() 
{
    char ch;
    scanf("%c",&ch);
    if((ch>=65&&ch<=90)||(ch>=97&&ch<=122))
        printf("YES\n");
    else 
        printf("NO\n");
        printf("不是字母\n");
    return 0;
}

上⾯的代码,你会发现输⼊的不论是否为字母,最终都会将“不是字母”打印在屏幕上。
在这里插入图片描述
这是因为 if 语句只能控制⼀条语句,printf(“不是字母\n”);这条语句是独立存在的,不管if语句的条件的真假,都会被执行。

若要使用if…else…语句控制多条语句,则需要使用{}将代码括起来。

#include <stdio.h>
int main() 
{
    char ch;
    scanf("%c",&ch);
    if((ch>=65&&ch<=90)||(ch>=97&&ch<=122))
    {
        printf("YES\n");
        printf("是字母\n");
    }
    else 
    {
        printf("NO\n");
        printf("不是字母\n");
    }
    return 0;
}

(4)if的嵌套使用:

在 if else 语句中, else 可以与另⼀个 if 语句连⽤,构成多重判断。

例:要求输⼊⼀个整数,判断输⼊的整数是0,还是正数或者负数。

#include <stdio.h>
int main()
{
	int num = 0;
	scanf("%d", &num);
	if (num == 0)
		printf("输⼊的数字是0\n");
	else
	{
		if (num > 0)
			printf("输⼊的数字是正数\n");
		else
			printf("输⼊的数字是负数\n");
	}
	return 0;
}

上述代码可以简化为if…else if…else…如下所示

#include <stdio.h>
int main()
{
	int num = 0;
	scanf("%d", &num);
	if (num == 0)
		printf("输⼊的数字是0\n");
	else if (num > 0) //这⾥的if 相当于嵌套在els语句中,形成了嵌套结构
		printf("输⼊的数字是正数\n");
	else
		printf("输⼊的数字是负数\n");

	return 0;
}

(5)悬空if:

如果有多个 if 和 else ,可以记住这样⼀条规则, else 总是跟最接近的 if 匹配。
首先请看下述代码:

#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,不等于 1 ,那就执⾏ else ⼦句,打印 haha。

但是当运行代码时,就会发现,输出的结果是:啥都不输出。
在这里插入图片描述
why?
这就是悬空 else 的问题,如果有多个 if 和 else ,可以记住这样⼀条规则, else 总是跟最接近的 if 匹配。

上述代码的排版让我们误以为else 是和第⼀个if匹配的,但是实际上却并非如此。
让我们将代码修一下将会更好理解。

#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确实和第⼀个if匹配,可以这样修改代码:

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

带上大括号代码的逻辑会更加的清晰,所以在此建议大家以后再写代码的时候尽量注意括号的使用。

2.switch语句:

(1)switch语句用法:

除了 if 语句外,C语⾔还提供了 switch 语句来实现分⽀结构。
switch 语句是⼀种特殊形式的 if…else 结构,⽤于判断条件有多个结果的情况。

例:输入整数输出相应的星期几

#include<stdio.h>
int main()
{
    int n;
    scanf("%d", &n);
    switch (n)
    {
    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;
    default:printf("输入有误"); break;
    }
    return 0;
}


• switch 后的 expression 必须是整型表达式
• case 后的值,必须是整形常量表达式

(2)switch语句中的break

#include<stdio.h>
int main()
{
    int n;
    scanf("%d", &n);
    switch (n)
    {
    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"); 
    default:printf("输入有误\n");
    }
    return 0;
}

在这里插入图片描述
在switch语句中,如果某一个case语句后没有break语句,代码将会继续向下执行,有可能会执行后方case语句中的代码,知道遇到break语句或者switch语句结束。

因此,在switch语句中break语句非常重要,只有将其放在正确的位置,才能真正实现分支效果。

当然,具体是否需要使用break语句,就要根据实际情况来看了。

(3)switch语句中的default

在使用switch语句时,我们会经常碰到switch后表达式中的值无法匹配case语句的情况,这时候default就将派上用场。
例:输入的数字对应扑克牌牌点

#include <stdio.h>
int main()
{
	int a;
	scanf("%d", &a);
	switch (a)
	{
	case 1:
		printf("A"); break;
	case 2:
		printf("2"); break;
	case 3:
		printf("3"); break;
	case 4:
		printf("4"); break;
	case 5:
		printf("5"); break;
	case 6:
		printf("6"); break;
	case 7:
		printf("7"); break;
	case 8:
		printf("8"); break;
	case 9:
		printf("9"); break;
	case 10:
		printf("T"); break;
	case 11:
		printf("J"); break;
	case 12:
		printf("Q"); break;
	case 13:
		printf("K"); break;
	default:
		printf("none");
		break;
	}
	return 0;
}

上述代码若输入1~13之外的数字,那么将会执行default语句中的代码,即打印“none”。如下图所示
在这里插入图片描述

(4)switch语句中的case和default的顺序

实际上在switch语句中,case子句和default子句并没有顺序要求,只要其位置能够满足需求即可。
但是,我们通常将default子句放在最后处理

二.循环语句

1.while循环:

(1)while语法结构:

while语句的语法结构与if语句比较相似。

while(表达式)
     语句;//如果循环体想要包含多个语句,则需要加上大括号

(2)while循环的执行流程

例:在屏幕上打印 1~10 的值

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

运行结果如下:
在这里插入图片描述

首先执行判断表达式,表达式的值为0,循环直接结束;表达式的值不为0,则执行循环语句,语句执行后再继续判断,是否进行下一次循环。

2.for循环:

(1)for语法结构:

for(表达式1; 表达式2; 表达式3)

表达式1用于循环变量的初始化
表达式2用于循环结束条件的判断
表达式3用于循环变量的调整

(2)for循环执行流程

首先:执行表达式1的初始化循环变量
然后开始循环:
Ⅰ:执行表达式2的判断部分,表达式2的结果如果==0,则循环结束;表达式2的结果如果!=0,则进入循环
Ⅱ:执行完循环语句后,再执行表达式3,调整循环变量
Ⅲ:调整循环变量后,再次回到表达式2进行判断

注:整个循环的过程中,表达式1初始化部分只被执行1次,剩下的就是表达式2、循环语句、表达式3在循环。

例:对n位好朋友说n遍”Happy new year!Good luck!”的祝福语。

#include <stdio.h>
int main() 
{
    int n;
    scanf("%d",&n);
    for(int i=0;i<n;i++)
    {
        printf("Happy new year!Good luck!\n");
    }
    return 0;
}

运行结果如下:
在这里插入图片描述

3.do while循环

(1)do while语法结构

do
{
 语句;
 }while(表达式)

(2)do while循环执行流程

do while循环比较特殊:

while 和 for 这两种循环都是先进行判断,条件如果满足就进入循环,不满足就跳出循环。

而 do while 循环则是先直接进入循环体,执行一次循环语句,然后再执行 while 后的判断。

所以 do while 循环必定执行一次

例:在屏幕上打印1~10的值

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

	return 0;
}

运行结果如下:
在这里插入图片描述
⼀般 do while 使用在循环的至少被执行一次的情况下,因此使用较少。

4.break和continue语句

在执行循环是,若要提前中止循环,那么将离不开 break 和 continue

(do while 循环中的 break 和 continue 几乎一模一样,因此下面仅以 while 循环和 for 循环为例)

(1)作用:

• break:永久中止循环,只要执行break,直接就会跳出循环。

• continue:跳过本次循环continue后的代码,在 for 循环与 while 循环中有差异

(2)break语句:

例:在屏幕上打印1~10的值
Ⅰ:while循环

#include <stdio.h>
int main()
{
	int i = 1;
	while (i <= 10)
	{
		if (i == 5)
			break;//当i等于5后,就执⾏break,循环就终⽌了
		printf("%d ", i);
		i = i + 1;
	}
	return 0;
}

运行结果如下:
在这里插入图片描述
Ⅱ:for循环

#include <stdio.h>
int main()
{
	int i = 1;
	for (i = 1; i <= 10; i++)
	{
		if (i == 5)//当i等于5后,就执⾏break,循环就终⽌了
			break;
		printf("%d ", i);
	}
	return 0;
}

运行结果如下:
在这里插入图片描述
由上可看出break在while和for循环中没有差异

(3)continue语句:

在while循环中的continue:

例:在屏幕上打印1~10的值

#include <stdio.h>
int main()
{
	int i = 1;
	while (i <= 10)
	{
		if (i == 5)
			continue;
		//当i等于5后,就执⾏continue,直接跳过continue的代码,去循环的判断的地⽅
		//因为这⾥跳过了i = i+1,所以i⼀直为5,程序陷⼊和死循环
		printf("%d ", i);
		i = i + 1;
	}
	return 0;
}

运行结果如下:
在这里插入图片描述

由上方代码我们可以分析出,在 while 循环中若将循环的调整放在 continue 之后,可能将会造成死循环

在for循环中的continue:

例:在屏幕上打印1~10的值

#include <stdio.h>
int main()
{
	int i = 1;
	for (i = 1; i <= 10; i++)
	{
		if (i == 5)
			continue;//这⾥continue跳过了后边的打印,来到了i++的调整部分
		printf("%d ", i);
	}
	return 0;
}

运行结果如下:
在这里插入图片描述
所以在 for 循环中 contiue 的作用是跳过本次循环中 continue 后的代码,直接去到循环的调整部分。

未来当某个条件发生的时候,本次循环⽆需再执行后续某些操作的时候,就可以使用 continue 来实现。

三.goto语句

C语言提供了一种非常特别的语法:goto 语句和跳转标号。

1.作用:

goto 语句可以实现在同一个函数内跳转到设置好的标号处。

2.用法:

例:跳过haha的打印

#include <stdio.h>
int main()
{
	printf("hehe\n");
	goto next;
	printf("haha\n");

next:
	printf("跳过了haha的打印\n");
	return 0;
}

在这里插入图片描述

3.缺点与优势

缺点:
goto 语句如果使的不当,就会导致在函数内部随意乱跳转,打乱程序的执行流程,所以我们的建议是能不用尽量不去使用。

优点:
在多层循环的代码中,如果想要快速跳出,使用 goto 就非常方便了。

如下:

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

原本在 for 循环中想提前退出循环必须使用break,但是一个break只能跳出一层 for 循环,如果循环嵌套过多,就要使用多个break,所以在这种情况下使用 goto 语句会更加快捷

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

W_XiangYu

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

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

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

打赏作者

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

抵扣说明:

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

余额充值