语句整理——C语言(控制语句)

一、分类

1.条件判断语句:
if语句;switch语句
2.循环执行语句:
while语句;do…while语句;for语句
for语句较为常用
3.专向语句
break;goto;continue;return
一般配合前面语句使用,实现特殊用法

二、if语句

1.作用

对表达式内容进行判断,表达式为真则执行语句,表达式为假则不执行。

	#include <stdio.h>

	int main()	
	{
		int num = 5;
		if(num > 10)
			printf("%d",num)
		else
			printf("%d",num + 1)//输出结果为6
	
	retutn 0;
	}

2.格式

在这里插入图片描述
注:
1.if语句后单条语句可不加{},但有多条语句时必须加{},否则只会运行其中一条语句
2.else ifelse后有多条语句时也需要加{}
3.else后面可不加表达式条件
4.VS有时if语句会报警告不是所有控件路径都返回值,需要在if语句后加一个else及return 0,如下:

else后return 0
这是由于if…else语句有未包含的情况

3.if嵌套

if语句嵌套进行多层分支选择

	#include<stdio.h>
	
	int main()
	{	
		int a = 10;
		int b = 20;
		int c = 30;
		if(a = b && a = c)//第一个if
			printf("%d = %d = %d",a,b,c)
		if(a >= b)//第二个if
		{
			if(c >= a)//第三个if
				printf("%d %d %d",c,a,b);
			else if(c <= b)
				printf("%d %d %d",a,b,c);
			else//c<a && c>b   第一个else
				printf("%d %d %d",a,c,b)
		}
		else//第二个else
		{	
			if(c >= b)//第四个if
				printf("%d %d %d",c,b,a);
			else if(c <= a)
				printf("%d %d %d",b,a,c);
			else//c>a && c<b   第三个else
				printf("%d %d %d",b,c,a);
		}

		return 0;
	}

进行多层嵌套时,else一般匹配最近的一个if,但是如果有 { } 则同一个括号内的相互匹配。例如第三个 if 和第一个 else 匹配,第四个 if 和第三个 else 匹配,因为他们都位于同一个括号内。第二个 if 和第二个 else 匹配,因为在同一优先级下第二个 else 离第二个 if更近。

4.注意事项

4.1 使用语句进行判断时不要使用连续比较(如 10<a<20)
计算机进行在比较完前两个数后会得出此表达式的结果为0(假)或1(真),再用前两个数的结果和后一个数比较,故代码达不到预期效果
需要注意C语言中规定真为非0,假为0,所以并不是所有结果真都为1

	#include<stdio.h>
	
	int main()
	{
		int num = 20;
		if(25 < num < 30)//结果为20,25<num结果为假等于0,0<30,结果为真,运行后面语句
			printf("%d\n",num);
		if(25 < num == 0)
			printf("%d\n",num + 1);//结果为21,证明判断为假时结果为0
		if(10 < num == 1)
			printf("%d\n",num + 2);//结果为22,证明判断为真时结果为1
		return 0}

不仅if函数,所有语句在使用时都需要注意这个问题
所以在有连续比较时,通常分次比较并以&&连接

	if(num >10 && num < 30)
		printf("%d",num);

4.2 if语句无法用break之类的结束,但当希望运行到当前if语句判断为真时结束当前函数,可以用return跳出

	#define _CRT_SECURE_NO_WARNINGS//VS中scanf会报错,加此句使其忽略这个错误
	#include<stdio.h>
	
	void print(int a, int b, int c)
	{
		if (b > c)
			return;//跳出函数
		printf("%d*%d =%2d  ", a, b, a * b);
		if (a >= b)
		{
			a = 1;
			b++;
			printf("\n");
		}
		else
			a++;
		print(a, b, c);//函数递归
	}

	int main()
	{
		int a = 0;
		int b = 0;
		int c = 0;
		scanf("%d %d %d", &a, &b, &c);//a、b确定起始位置,c确定范围
		print(a,b,c);
	
		return 0;
	}

三、switch语句

1.作用

根据switch后的整形表达式确定运行后面哪一个语句

	#include<stdio.h>
	
	int main()
	{
		int a = 0;
		switch(a)
		{
		case 0 :
			printf("%d",a);//运行结果为0
			break;
		case 1 :
			printf("%d",a + 1);
			break;
		default :
			break;
		}
		return 0;
	}

2.结构

switch(整形表达式)
{
case (整形) :
语句;
break;
default :
语句
break;
}

3.switch嵌套

switch可以嵌套使用

	#include<stdio.h>
	
	int main()
	{	
		int m = 1;
		int n = 2;
		switch(m)
		{
		case 1 :
			n++;//m=1,n=2,此句运行后n=3
		case 2 :
			m++;//m=1,n=3,此句运行后m=2
		case 3 :
			switch(m)//m=2所以进入case2
			{case 1 :
				n++;
			case 2 :
				m++;//m=2,n=3,此句运行后m=3
				n++;//m=3,n=3,此句运行后n=4
			}	
		case 4 :
			n++;//m=3,n=4,此句运行后n=5
		}
		printf("%d %d ",m,n);//m=3,n=5
		
		return 0;
	}

注:
1.case和后面的整形之间必须加空格,若不加空格则无法通过switch后的整形表达式找到相应的case语句:
case1(错误)------ case 1(正确)
2.switch必须加 { }
3.不能用n+1代替n++,但可以写成n=n+1,因为n++为一个表达式语句,而n+1为一个表达式,不是语句,无法执行
4.没有break则case会按顺序执行下去
5.switch语句中最后要加default,前面所有case语句都不满足时执行default语句

4.break在switch中的用法

4.1 switch中的break放在case语句后,建议每一个case都放break,否则会从满足条件的case语句开始,一直执行到最后一个语句,见上述代码。
4.2 当有多个相同含义的case时,可以只在分界的case处放break。

	
	#include<stdio.h>
	
	int main()
	{
		{int day = 0;//假设输入1——7的数字,输出星期1——7
		scanf("%d", &day);
		
		//每一个case有单独的break
		switch(day)
		{case 1 :
			printf("星期一\n");
			break;
		case 2 :
			printf("星期一\n");
			break;
			//……中间剩余时间省略
		case 6 :
			printf("星期六\n");
			break;
		case 7 :
			printf("星期天\n");
			break;
		default ://提醒输入非1——7的数字
			printf("输入错误\n");
			break;
		}
		
		//多个case共用一个break
		switch(day)
		{
		case 1 :
		case 2 :
		case 3 :
		case 4 :
		case 5 :
			printf("工作日\n");
			break;
		case 6 :
		case 7 :
			printf("休息日\n");
			break;
		default ://提醒输入非1——7的数字
			printf("输入错误\n");
			break;
		}

		return 0;	
	}

四、while语句

1.作用

1.1 在while语句范围内,通过判断while后的表达式是否为真决定while后的语句是否执行。每次执行完成后会返回while判断处,如果为真会再次执行。所以while语句内会有一个判定条件,判定条件决定循环是否继续执行,否则while语句会陷入死循环。
1.2 判定条件一般包括在while语句内赋一个判断值或者使用break语句;判断值即为while后的表达式内的值,可通过在语句内部改变判定数值,保证循环有终点,break则是永久终止循环。

2.结构

在这里插入图片描述
break用于永久终止循环;
continue用于跳过本次循环后面的代码。

3.break和continue用法

3.1 break通常可以配合其他判断语句(如if语句)使用,以达到想要的效果

	#include<stdio.h>
	
	int main()
	{
		int i = 0;
		while(i < 10)
		{
			if(5 == i)
			{
				break;
			}
			printf("%d ", i);//结果为0 1 2 3 4
			i++;
		}
		
		return 0;
	}	
  • 上述中的 i 就是一个判定值,在break不执行的情况下,i 达到条件时也会终止循环,i++即是对判定值在语句内部的更改;
  • break在达到 i = 5的条件时便会运行,此时打印出1-4后,便不会继续打印;另外在代码中需使用= =表示等于,若只使用1个则为赋值,会直接执行break,不会往后执行
  • 在不运行break时while后循环会执行n次,while会执行n+1次,因为循环最后一次后会在去while进行判定

3.2 continue通常也是配合条件语句使用,需要注意的时continue跳过后面代码后还是会继续执行循环语句,这是需要和break区别开的。

	#include<stdio.h>
	
	int main()
	{
		int i = 0;
		while(i < 10)
		{
			a++;//必须在continue前面
			if(5 == i)
			{
				continue;
			}
			printf("%d ", i);//结果为1 2 3 4 6 7 8 9 10
		}
		
		return 0;
	}	
  • 当使用continue时需要注意判定值不能在continue后面,否则会导致语句陷入死循环

五、for语句

1.作用

常用的循环句式,使用方便,嵌套也比较方便。

2.结构

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

表达式1是初始化值,决定开始位置;
表达式2是条件判断,决定结束位置;
表达式3是调整部分,决定判定值变化;
在使用for循环时,表达式之间需以 ”;“ 隔开
for后只有一条语句可不加 { } ,有多条则必须加 { }

	#include<stdio.h>

	int main()
	{
		int i = 0;
		for(i = 0;i < 10;i++)
		{
			printf("%d ", i);		
		}
	
		return 0;
	}

在表达式1进行变量初始化:for(int i = 0; i < 5; i++) 部分编译器可能不支持此种写法,所以不建议在表达式内部初始化

3.for循环的使用及循环嵌套

3.1 for后的三个表达式很重要,其内部的内容可以省略,写成 for( ; ; ),此为一个死循环语句,也可只省略判断语句,意为判断恒成立

	int i = 0;
	for(;;)
		printf("%d",i);死循环打印0
	for(i = 0; ;i++)
		printf("%d",i)//死循环打印i++

需要注意如上同时使用两个死循环for语句时,只有一个for能被执行

3.2 for循环可用多个变量控制循环

	int x = 0, y = 0;
	for(x = 0,y = 0; x < 5 && y < 2; x++,y++)
		printf("%d %d ",x,y);//结果为0 0 1 1

3.3 当判定条件为赋值语句时,循环次数可能为0次或无限次,为等于会运行1次,且结果正确才会运行

	int i = 0,j = 0;
	for(i = 0; i = 0;i++)
		printf("%d ",i);
	//i=0意为将0赋值给i,i=0结果为假,故此语句不会运行	
	for(j = 0; j = 5;j++)
		printf("%d ",j);
	//j=5为赋5给j,j=5结果为真,运行结果会死循环打印5
	for(i = 0; i == 0;i++)
		printf("%d ",i);
	//j==0为判断语句,j!=0时结果不运行,本次只会运行1次,结果为0
	for(j = 0; j == 5;j++)
		printf("%d ",j);
	//j==5为判断语句,结果为false,不运行

3.4 for循环嵌套时,外层运行一次,内层运行所有循环次数

int i = 0,j = 0;
	
	for(i = 0;i < 3;i++)
	{
		for(j = 0;j < 3;j++)
			printf("");
			
	}

一共会打印9个“打印+1”,当 i= 0 第一个for运行第一次,进入第二个for运行 j=0,1,2共三次;当 i=1 第一个for运行第二次,进入第二个for,j 被初始化为0,所以 再次运行 j=0,1,2共三次。因为 i<3 共有3个值,故一共会运行9次。

3.5 for嵌套使用时,如果省略初始化值会影响内层值

	int i = 0,j = 0;
	
	for(;i < 3;i++)
	{
		for(;j < 3;j++)
			printf("i=%d,j=%d\n",i,j);
	//运行结果:
	//i=0,j=0;
	//i=0,j=1;
	//i=0,j=2;
	}

i = 0进入第一个for运行一次,进入第二个for运行3次后第四次 j = 3跳出本循环;i = 1第二次进入第一个for循环,当运行至第二个for循环时,因为没有初始化,j 的值为前面得出的3,不满足j<3,跳出本循环,i=2第三次进入第一个for循环,重复步骤。
可知本次for循环的出的结果只是第一次得出的,后面两次未能进入打印,未得出结果。

六、do…while语句

1.作用

先运行在进行判定,和while和for循环不同的是,do…while循环可以不用限定一个范围,而可以通过键入一个0或非0的命令决定循环是否继续。

	int i = 0;
	do
	{
		print("  0 = 退出  ");
		print("  1 = 继续  ");
		scanf("%d", &i);
	}while(i);

通过此种方式可以自己控制循环是否继续。

2.结构

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

当do后面只有一条语句时可以不加 { } 但是有多条语句时必须加 { } ;

七、其他语句

1.goto语句

作用: 跳转到符号位置,滥用goto语句可能造成错误,所以要尽量少写goto语句
注意: goto语句是无法跨函数跳转的

	again:
		printf("打印");
		printf("循环");
		goto again;//goto语句写成的死循环

2.return、break、continue

return: 用于函数返回一个值或者函数中分支语句结束跳出执行。

return关键字终止其出现的函数的执行,并将控制(以及表达式的值(如果给定))返回给调用函数。默认情况下,函数返回一个整数值。要定义其他类型的返回值,函数的名称前面是类型。如果函数的类型为void,则会省略return语句。

break: 用于永久终止一个循环
continue: 用于跳过一个循环后面的代码,使用continue时需注意循环的判定条件变化不能放在continue后面,否则会造成死循环。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值