看得懂的C语言--分支语句、循环语句、goto语句

前言

C语句分为以下六类:
表达式语句、函数调用语句、控制语句、复合语句、空语句、赋值语句;
这里将介绍控制语句。

C程序的执行部分是由语句组成的。程序的功能也是由执行语句实现的。

一、分支语句(选择结构)

分支,意味着有多条路可走。在这里插入图片描述

在这里插入图片描述


1、if语句

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

(1)、语法结构

a、单分支

if(表达式)
    语句;

b、多分支

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

(2)、括号里的表达式

如何判定?
如果表达式的结果为真,则语句执行。
在C语言中如何表示真假?
C语言没有逻辑型变量和逻辑型常量,也没有专门的逻辑值,故以“非0”代表“真”,以“0”代表“假”。


if语句中的“表达式”可以是关系表达式、逻辑表达式,甚至是数值表达式

a、关系表达式

所谓关系表达式就是两个数值进行比较的式子。 指运算符为<,<=,>,>=,==,!=的表达式。
注意:c语言中等于是‘==’,不等于是‘!=’ 。

在关系表达式求解时,以“1”代表“真”,以“0”代表假。当关系表达式成立时,表达式的值为1,否则表达式的值为0。

如下所示:

若a > b ,则返回1,1就是为真,那么就执行return x;

if (a > b) {
    return x;
}
return y;

b、逻辑表达式

用逻辑运算符将关系表达式或逻辑量连接起来的有意义的式子称为逻辑表达式。指运算符为 或 ||、与 &&、非 ! 的表达式。

返回值为0或1,0表示假,非0表示真.
例如!0返回1,0&&1返回0,0||1返回1。

如下:
a或b只要有一个为真,那么表达式为真,就执行return x;

int a = 0;
int b = 2;
if (a || b) {
    return x;
}
return y;

c、数值表达式

数值表达式是指评估为数字的任意表达式。该表达式可以是变量、常量、函数和运算符的任意组合。主要包括常量、算术运算符、关系运算符、逻辑运算符等。
只要括号里最后是一个值,那么就可以是数值表达式。

例如:
算术运算符包括符号:+(正)、-(负),运算符:+(加)、-(减)、*(乘)、/(除)和MOD(取模)。这些运算符和常量、括号可组成数值表达式。

a+b=3,3是非零数,因此条件为真,执行return x;

int a = 1;
int b = 2;
if (a + b) {
    return x;
}
return y;

(3)、养成好习惯

a、一句话也要加花括号

如果if语句后只接一条语句,那么就可以不写花括号,但是建议写上,因为阅读更有条理,清晰明了。

//代码1
if (a) {
    return x;
}
return y;
//代码2
if(b)
{
    return x;
}
else
{
   return y;
}

b、括号里需判断相等时,已知的值写在左边

如果写在右边,有时候我们可能会漏掉一个‘=’,导致写成num = 5,但是这样写编译器是不报错的,因为它就是将5赋给num

int num = 1;
if(5 == num)
{
    printf("hehe\n");
}

2、switch语句

switch语句从字⾯上讲,可以称为开关语句,是⼀种多分⽀选择结构,⼀般与case、break、default配合使⽤,对流程进⾏控制。

比如:
如果你想判断选择输出星期几
输入1,输出星期一
输入2,输出星期二
输入3,输出星期三
输入4,输出星期四
输入5,输出星期五
输入6,输出星期六
输入7,输出星期日
if…else if …else if 的形式太复杂,那我们就得有不一样的语法形式。
就用switch 语句。

(1)、语法结构

从表达式值等于某个case语句后的值开始,它下方的所有语句都会一直运行,直到遇到一个break为止就会退出switch语句,若没有与之相等的那么就会直接执行default后退出,若没有dedault,那就什么也不执行,退出。

a、第一种,表达式的值等于某个case后的值,那么就执行那句话,它下方的所有语句都会按顺序一直运行(包含default),直到所以都执行完就退出switch。

//第一种,
switch (表达式){
	case1 : 语句1
	case2 : 语句2
	... ... ...
}

b、第二种,表达式的值等于某个case后的值,那么就执行那句话,它下方的所有语句都不会运行,因为break跳出了switch语句。

break语句,是中断当前循环
通常在 switch 语句和 while、for、for…in、或 do…while 循环中使用 break 语句。
执行 break 语句会退出当前循环或语句,并开始执行紧接着的语句。
在switch语句中,我们没办法直接实现分支,搭配break使用才能实现真正的分支。

//第二种,有break;
switch (表达式){
	case1 : 语句1
			break;
	case2 : 语句2
			break;
	... ... ...
}


c、第三种,表达式的值等于某个case后的值,那么就执行那句话,它下方的所有语句都不会运行,因为break跳出了switch语句。 但是如果没有与之匹配的值,那么将会 执行default语句再退出。

//第三种,有break和default
switch (表达式){
	case1 : 语句1
			break;
	case2 : 语句2
			break;
	... ... ...
	default : 语句n		
			break;
}

(2)、语句规则

a、switch语句后的控制表达式只能是short、char、int、long整数类型和枚举类型不能是float,double类型(char也是属于整型家族的,因为用ASCII码存储的。)

b、case条件里面只能是常量或者字面常量,并且case有唯一性不能有相同的值。此外case后面不需要花括号

c、default没有也无所谓,有但有且只能有一个。

d、switch和case的值不能为null,会报错。

e、case和default的顺序无要求。

(3)、编程好习惯

a、在最后一个 case 语句的后面加上一条 break语句。(之所以这么写是可以避免出现在以前的最后一个 case 语句后面忘了添加 break语句)。

b、在每个 switch 语句中都放一条default子句是个好习惯,甚至可以在后边再加一个 break 。


二、循环语句

循环,意味着重复做!
在这里插入图片描述

1、while循环

在这里插入图片描述

(1)、语法结构

我们已经掌握了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;
}

(2)、表达式判断

while括号里的表达式判断与if相同, 可以回到上面 if 语句部分再记一下。

(3)、break(终止循环)和continue(结束本次循环)

在这里插入图片描述

a、break

break,中断当前循环。

break在while循环中的作用:其实在循环中只要遇到break,就停止后期的所有的循环,直接终止循环。
所以:while中的break是用于永久终止循环的。(for和do…while中也是如此)

如下:

答案是1 2 3 4 ,因为在i == 5 是执行break语句,于是跳出循环,后面的数不在输出。

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

b、continue

continue,结束本次循环,进行下一次循环,而不终止整个循环的执行。

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

如下:
答案是: 2 3 4 6 7 8 9 10 11,在循环打印2~11的过程中,当i等于5时执行continue,跳过后面的语句并跳出本次循环,到下次循环。

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

2、do…while循环

在这里插入图片描述

(1)、语法结构

do…while 循环是 while 循环的变体。在检查while()条件是否为真之前,该循环首先会执行一次do{}之内的语句,然后在while()内检查条件是否为真,如果条件为真的话,就会重复do…while这个循环,直至while()为假。

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

(2)、与while循环的区别

第一点:do…while和 while 循环主要的区别是 do-while 的循环语句的执行方式是先执行一次后才判断循环是否继续,do…while至少会执行一次),然而while 循环是先判断真假再决定是否执行
第二点:do while语句中的continue会让程序跳转到判断部分,而后重新执行do语句。进入循环,break是相同的。

while后面的 分号 一定要记得写千万记得

如下:
答案为 10,先执行打印语句在判断为假,退出循环(至少有一次执行)

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

3、for循环

在这里插入图片描述


我们已经知道了while循环,但是我们为什么还要一个for循环呢?

我们先学学语法再来探讨这个问题。

(1)、语法结构

  • 表达式1为初始化部分,用于初始化循环变量的
  • 表达式2为条件判断部分,用于判断循环时候终止。(与分支和其它的循环相同 )
  • 表达式3为调整部分,用于循环条件的调整
for(表达式1; 表达式2; 表达式3)
{
 	循环语句;
}

执行过程为:
第一步:执行表达式1;
第二步:执行表达式2。如果它的值为,则执行 for 语句中的循环语句,然后执行第三步;如果它的值为,则结束循环
第三步:执行表达式3;转回上面第二步继续执行
注意:在该过程中“表达式1”只执行一次

示例:
用for循环 在屏幕上打印1-10的数字。
关键的点
for(i=1; i<=10; i++)
for(初始化; 判断部分; 调整部分)

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

现在我们来看看while和for的区别,你就会知道为什么for循环更简便广泛

从下面的代码可以发现在while循环中依然存在循环的三个必须条件,但是由于风格的问题使得三个部分很可能偏离较远,这样查找修改就不够集中和方便。所以,for循环的风格更胜一筹;for循环使用的频率也最高。

//while循环
int i = 0;

i=1;//初始化部分
while(i<=10)//判断部分
{
 printf("hehe\n");
 i = i+1;//调整部分
}
//for循环
for(i=1; i<=10; i++)
{
 printf("hehe\n");
}

(2)、表达式判断与if、while相同

(3)、for循环里面的break和continue

在这里插入图片描述
在for循环中也可以出现break和continue。

a、break

for循环中,与while的break的用法相同 - 直接跳出循环,也就是永久终止循环!

b、continue

在for语句中,continue作用同while中也基本一样,但continue会执行for语句()中调整部分后再回到判断。

如下:
答案:1 2 3 4 6 7 8 9 10
若 i 等于5执行continue,之后跳过打印执行调整部分 i++再判断

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

(4)、for循环变式的介绍

a、for( ;;)

该循环为死循环,因为判断部分省略意味着判断恒成立

#include <stdio.h>
int main()
{
	for(;;)
 	{
		 printf("hello\n");
 	}

b、for(; 表达式2;表达式3)

如下:

省略了表达式1之后仍可以输出1~10

#include <stdio.h>
int main()
{
	int i = 0for( ;i < 10;i++)
 	{
		 printf("hello\n");
 	}

但是不推荐初学者使用这种方法,避免错误
像如下代码:
两个for语句中表达式1都省略了
在这里插入图片描述

c、for(表达式1,表达式2;表达式3;表达式4,表达式5)

使用多余一个变量控制循环。

#include <stdio.h>
int main()
{
	
	int a = 0;
	int b = 0;
    for (a = 0, b = 0; a<2 && b<5; ++a, b++)
   	{
        printf("hello\n");
   	}
 return 0;

(5)、注意事项

a、for循环中的变量可以是一个也可以是多个

b、括号里的表达式之间是用分号隔开的,不要写成逗号

c、for(表达式1;表达式2;表达式3)的后面不要加分号

d、for循环可以有多层嵌套。(for循环里面有for循环)

e、for循环中的变量生存周期为一次循环迭代

重复执行程序中的循环,直到满足某条件为止,亦称为迭代

就是说for 循环内定义的变量的生命周期周期只有一次每循环一次,执行一次循环体,若在里面创建了变量,则每次进来都需重新创建一次变量

(6)、建议

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

b、 建议for语句的循环控制变量的取值采用“前闭后开区间”写法。有助于对代码的理解。

int i = 0;
//前闭后开的写法
for(i=0; i<10; i++)
{}
//两边都是闭区间
for(i=0; i<=9; i++)
{}

三、goto语句

(1)、语法结构

goto语句也称为无条件转移语句,其一般格式如下:
goto 语句标号;(可以转移到语句标号的位置)

其中语句标号是按标识符规定书写的符号,放在某一语句行的前面,标号后加半角冒号“:”。语句标号起标识语句的作用,与goto句配合使用。

如:

定义标识符again:,如果 i 等于 5,那么就goto转移到again处往下执行。

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

(2)、goto实用功能

虽然C语言中提供了goto语句和标记跳转的标号。但是如果随意滥用很容易写出bug,而且即使不用goto,我们也能很容易的实现想要的功能,因此从理论上 goto语句是没有必要用的。

但是某些场合下goto语句还是用得着的,最常见的用法就是终止程序在某些深度嵌套的结构的处理过
程。

例如:一次跳出两层或多层循环。

如下:

当出现多层循环这种情况使用break是达不到目的的。break只能从最内层循环退出到上一层的循环。于是我们可以用goto语句直接转移出来

for(...)
    for(...)
   {
        for(...)
       {
            if(...)
                goto end;//goto跳出至标识符
       }
   }
//标识符
end:
...  ...

结束

该篇介绍的控制语句到这就结束了,如果对你有帮助,请动动手指点个赞,这样我会非常有动力的。感谢支持!

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值