02分支语句和循环语句

本章将带大家学习分支语句和循环语句的使用。



一、语句是什么

在C语言中,用分号(;)隔开的就是一条语句。

比如下面的四条语句:

int a=1;
int b=2;
printf("hello world");
int c=(a+1,b+2,a+b);

二、分支语句(选择结构的语句)

1.if 条件语句

if语句即为判断语句,当if中的表达式为真时,就执行if后面的语句,如果为假,则不执行。

if语句的语法结构:

if(表达式)
    语句;

举个例子:

#include<stdio.h>
int main()
{
    int a = 10;
    if (a >= 10)
        printf("hello world");
    return 0;
}

在这里插入图片描述
当条件不满足时,则不会执行语句:
在这里插入图片描述

1.1. if语句与else搭配使用

if语句可以单独使用,也可以与else搭配使用,但else语句无法单独使用。

if与else使用,当if中的条件不成立时,则会执行else语句;如果条件成立,则会执行if语句的内容,不会执行else的内容。

语法结构为:

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

看下面代码:

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

在这里插入图片描述
在这里插入图片描述

1.2. if,else if和else组成的多分支语句

这种语句形式提供了两种以上的判断方式。语句会依次往下匹配if和else if语句中的条件,如果条件成立则会执行相应的语句,当所有条件都不成立时则执行最后的else语句。

语法结构:

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

看下面的例子:

#include <stdio.h>
int main()
{
	int age = 0;
	scanf("%d", &age);
	if (age < 18)
	{
		printf("少年\n");
	}
	else if (age >= 18 && age < 30)
	{
		printf("青年\n");
	}
	else if (age >= 30 && age < 50)
	{
		printf("中年\n");
	}
	else if (age >= 50 && age < 80)
	{
		printf("老年\n");
	}
	else
	{
		printf("长生不老\n");
	}

}

在这里插入图片描述
在这里插入图片描述
值得注意的是:

当有多个if和else if满足条件时,程序只会执行自上而下最先遇到的那条语句,因为在执行完一个判断时,程序将会跳出整个if–else if–else程序。

在这里插入图片描述

这里有两个else if满足条件,但程序只会执行最上面的那个,执行完以后直接跳出程序。

在这里插入图片描述在这里插入图片描述

1.3. if语句中的一些常见问题

1.3.1 if判断条件后面加分号(;)

当if判断条件后面以后加入分号,if的判断条件将成为一句单独的语句,与下面的执行语句没有任何关系,也就是说,无论if中的判断条件成不陈立,都会执行if下面的语句。
看下面代码:

#include <stdio.h>
int main()
{
	int age = 17;
	if (age > 18);
	printf("成年");

	return 0;

}

在这里插入图片描述
很显然if里的判断条件并不成立,但依然执行printf语句。

1.3.2 if执行的语句不加大括号

当if后面要执行的语句不加大括号时,默认if只与最近的那一条语句匹配。

#include <stdio.h>
int main()
{
	int age = 17;
	if (age > 18)
	printf("成年");
	printf("可以喝酒");

	return 0;

}

在这里插入图片描述

这个程序中 printf(“可以喝酒”);这条语句与if语句并没有关系,if里的条件无论成不成立都会执行这条语句。

想要 printf(“可以喝酒”);这条语句受if控制,则需要加入{}:

#include <stdio.h>
int main()
{
	int age = 17;
	if (age > 18)
	{
		printf("成年");
		printf("可以喝酒");
	}
	return 0;

}

在这里插入图片描述

1.3.3 if中的条件为一个区间的情况

我们在上面的程序中,如果要表示一个大于等于18小于30岁的年龄,我们用age >= 18 && age < 30来表示,为什么不用我们数学中的18<=age<30来表示呢?

先来看一下如果这样表示程序会有怎么样的后果:

在这里插入图片描述

要解释这个问题就要先了解C语言的真和假与if语句判断的条件的关系

当if中的判断条件为真(也就是非0)时,if就会执行与它匹配的语句,当判断条件为假(也就是0)时,if则不执行与它匹配的语句。一般情况下,如果一个结果为真,则输出结果为1,否则就为0.比如一个if(age>18)中,如果age是19,则if中的语句为真,输出1,因此if(age>18)就相当于if(1);反之如果age是17,则相当于if(0)。

而在程序执行else if (18 <= age < 30)这个语句时,程序会从左往右依次执行,先判断18<=age再判断age<30;很显然18<=age中age是55的话,这个判断为真,因此18<=age返回1;后面再执行age<30这个判断,就相当于判断1<30这句话了,很显然这也是真的,因此整体的表达式就是真的,if自然也就会执行与之匹配的表达式了。

为了改变这种情况,我们在判断一个区间时通常用&&(与)这个运算符来分开判断是否同时满足左区间和右区间。只有当&&两边的结果都是真时,整体结果才为真。

1.3.4 if语句中悬空else的匹配问题

当出现多个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;
}

在这里插入图片描述

结果并没有打印任何东西,因为else这条语句是与if(b==2)进行匹配的,而不是if(a == 1) ;因此当if(a == 1)这条语句中的条件为假,if(b == 2)这条语句不会执行,与之匹配的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;
}

或者加入{}

#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 (a == 1)这条语句匹配了。

1.3.5 在判断条件中将==写成=

如果在将判断语句中的==写成=,那就不再是判断而是赋值。
看下面的代码:

#include <stdio.h>
int main()
{
	int a = 0;
	if (a = 1)
	{
		printf("hello world\n");
	}
	return 0;
}

这条语句中if中的条件是将1赋值给变量a,整体的结果就是1,为真,执行打印。
在这里插入图片描述
除非if中的判断语句是将0赋值给变量,否则其他情况整体的结果都是非0,都为真。

#include <stdio.h>
int main()
{
	int a = 1;
	if (a = 0)
	{
		printf("hello world\n");
	}
	return 0;
}

在这里插入图片描述
为了避免这种错误,我们除了养成良好的代码习惯外,还可以将变量和常量的位置进行调换,将a==1写成1 == a,这样即使我们错误地将 == 写成 =,编译器也会报错:
在这里插入图片描述
因为=这个赋值操作符无法将变量的值赋值给常量。


2. switch条件语句

switch语句也是一种分支语句。 常常用于多分支的情况。
语法为:

switch(整型或字符型表达式) 
{
case 整形或字符型常量表达式1:
     语句1case 整形或字符型常量表达式2:
     语句2... ...
default//default这条语句可以不加,相当于if语句中的else
     上述所有条件都不成立时执行的语句
}

switch中的表达式必须为整形或者字符型,不能是浮点型,在此只对整形的表达式进行讨论,字符型与整形类似。程序在执行过程中会根据switch中的表达式的值匹配下面的case语句中整形或字符型常量表达式的值,相同则会以该语句为起始位置依次向下执行下面的语句。

我们以下面的程序,来对switch进行说明:

#include <stdio.h>
int main()
{
	int day = 3;
	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;
}

在这里插入图片描述
当day为3时,程序会在case 3这条语句下依次往下执行,这显然不是我们想要的,我们想要程序只打印星期三,因此为了能使程序执行完case 3就终止,我们需要关键字break来跳出程序。

2.1 break关键字在switch语句中的重要性

实际上,一般情况下case后的语句都会带上break,用来跳出程序。
我们将上述代码加上break:

#include <stdio.h>
int main()
{
	int day = 3;
	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;
}

在这里插入图片描述
打印结果很符合我们的预期。

2.2 switch中的default子句

当 switch表达式的值并不匹配所有case标签的值时,default子句后面的语句就会执行。
所以,每个switch语句中只能出现一条default子句。
default与if语句中else类似,但default可以放在switch程序的任意位置,不过我们一般放在最后面,而else必须放在if语句的最后面。

为了让别人能够更容易看懂我们的代码,也为了便于修改我们的代码,我们可以养成以下的良好编程习惯:

在最后一个 case 语句的后面加上一条 break语句。 (之所以这么写是可以避免出现在添加一个case语句后,以前的最后一个 case 语句后面忘了添加 break语句)。
在每个 switch 语句中都放一条default子句是个好习惯,甚至可以在后边再加一个 break。

在switch&&case语句中:

  1. switch语句中,case完成的是判定功能,break完成的是分支功能,default处理异常情况;
  2. case:当执行语句是一个case执行多条语句,case多条语句(不能定义变量,如果需要有多条语句则可以用花括号{}或者函数)break
  3. case:当有多条case匹配一条语句,则多条case后面不写break;
  4. default可以出现在任何地方,推荐放在结尾;
  5. case:不能是const变量,普通的变量,建议有好的布局的case方式,容易匹配到的放到前面。

三、循环语句

1. while循环语句

while循环的语法结构:

while(表达式)
 循环语句;

当while中的表达式为真时,执行循环语句,然后再次判断表达式是否为真,为真则继续执行循环语句,如此反复,直到表达式为假则跳出循环语句。

比如打印数字1-10的程序:

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

}

在这里插入图片描述

这个代码通过i=i+1这一条语句来改变i的值,使i为11时不符合while循环的条件,从而跳出循环。

1.1 while循环中break的作用

break的作用是使程序跳出while循环,比如在上面程序中加上break:

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

}

在这里插入图片描述
当i为6时if条件成立,程序读到break,跳出循环。

1.2 while循环中continue的作用

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

我们对上述代码进行修改,加入continue:

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

在这里插入图片描述

当i为5时,遇到continue,程序直接跳转到while语句中的判断部分,并没有执行后面的打印语句。

continue使用不当可能会造成死循环:

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

在这里插入图片描述
当i为5时,遇到continue,会直接跳过i=i+1的操作,直接进行判断,此时i仍然为5,因此会一直执行打印的操作。


2. for循环语句

for循环语句的语法风格与while循环不同,for循环语句更像是把while循环语句的变量改变部分放在一条()内,而不是放在循环的内容中。

for循环的语法结构如下:

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

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

for循环执行时,先执行表达式1对变量初始化;然后进行表达式2判断变量是否为真,为真执行循环语句,为假则跳出循环;循环语句执行完以后执行表达式3,对变量进行改变;然后再进行表达式2判断变量是否为真,如此不断循环,直到表达式2为假跳出循环。

我们可以将for循环和while循环进行对比,比如相同的打印数字1-10的程序:

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

}

可以看出for循环更加简洁明了一些,循环条件更集中,更方便我们查找和理解。

2.1 for循环语句中的break和continue

for循环语句中的break与while循环语句中的相同,都是终止循环,在此不作过多说明。
for循环语句中的continue与while循环中的不同,while中的continue是让程序直接跳转到while语句中的判断部分,不执行后面的语句,但是for循环中的continue则是让程序跳转到表达式3也就是条件改变的部分。

比如下面的语句:

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

在这里插入图片描述

程序并没有死循环,而是在i为5时跳过打印,直接跳转到i++的部分。

2.2 for循环中的一些注意事项

2.2.1 for循环中的表达式可以为空

for(表达式1;表达式2;表达式3)其中表达式123均可以为空,但分号( ; )不能省略。这样做可能会造成程序死循环,一般只在特殊情况下使用。

比如:

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

在这里插入图片描述

2.2.2 一般不建议在for 循环体内修改循环变量,防止 for 循环失去控制

比如:

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

在这里插入图片描述


3. do while循环

do while循环与while循环相比,do while循环先执行一次循环语句,再进行判断,因此循环至少执行一。由于使用的场景有限,所以不是经常使用。其性质和while循环类似,在此不作过多介绍,只给出具体语法和代码示例。

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

在这里插入图片描述


4. 循环语句中嵌套循环语句

循环语句中嵌套循环语句,可以让我们的程序描述更多的循环情况。比如我们可以用嵌套循环打印乘法表:

#include<stdio.h>
int main() {
    int i, j;
    for (i = 1; i <= 9; i++) 
    {
        for (j = 1; j <= i; j++)
        {
            printf("%d*%d=%d   ", j, i, j * j);
        }
        printf("\n");
    }
}

在这里插入图片描述


四、goto语句

go to语句可以直接使程序跳转到标记位置。
语法结构:

goto 标记位置的名称;
... ...
标记位置的名称:
   其他语句

用goto可以实现某些循环语句:

#include <stdio.h>
int main()
{
	int a = 0;
	printf("1+1=>");
again:
	scanf("%d", &a);
	if (a==2)
	{
		printf("回答正确\n");
	}
	else
	{
		printf("回答错误,请重新输入\n");
		goto again;
	}
	return 0;
}

在这里插入图片描述
改程序用循环语句也可以完成:

#include <stdio.h>
int main()
{
	int a = 0;
	printf("1+1=>");
	while (1)
	{
		scanf("%d", &a);
		if (a == 2)
		{
			printf("回答正确\n");
			break;
		}
		printf("回答错误,请重新输入\n");
	}
	return 0;
}

在这里插入图片描述

goto语句主要用来跳出多层循环语句,因为用break要用很多次

for(...)
    for(...)
   {
        for(...)
       {
            if(disaster)
                goto error;
       }
   }
    …
error:
 if(disaster)
         // 处理错误情况

总结

此篇博客带大家具体了解了C语言中的分支语句和循环语句。
这些语句我们在日后的学习中会多次用到,因此非常重要,应该重点掌握。
有了这些语句我们就可以写出很多有趣的代码。
当然,这篇博客如果有任何错误,或者各位大佬有任何建议,可以在评论区指出和提出,我会对博客进行修改和完善。

  • 17
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 7
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

今天也要写bug、

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

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

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

打赏作者

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

抵扣说明:

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

余额充值