什么是语句?

C语句可以分为以下五类:

  1. 表达式语句
  2. 函数调用语句
  3. 控制语句
  4. 复合语句
  5. 空语句

本篇介绍控制语句

控制语句用于控制程序的执行流程,以实现程序的各种结构方式,它们由特定的语句定义符组成,C语句有九种控制语句。

可分为以下三类:

  1. 条件判断语句(分支语句):if语句、switch语句;
  2. 循环执行语句:do . . . while语句、while语句、for语句;
  3. 转向语句:break语句、goto语句、continue语句、return语句。

分支语句(选择结构)

人生常常面临选择,也总是生活在后悔中,后悔为什么没有选择另一条路。

不同的选择,往往面临不一样的结局!

1.if语句

if语句的语法结构(三种):

//单分支
if(表达式)
    语句;
//双分支
if(表达式)
    语句1;
else
    语句2;
//多分支
if(表达式1)
    语句1;
else if(表达式2)     
    语句2;
else if(表达式3)
    语句3. . .
else if(表达式n)
    语句n;
else
    语句;

实战:

如果条件成立时,想执行多条语句,这时就需要加大括号

if(表达式)
{
    语句1;
    语句2;
    ...
    语句n;
}

注意:

  • 表达式为真时,语句才执行。0表示假,非0表示真
  • 执行单条语句,可以不加大括号,执行多条语句,一定要加大括号

悬空else

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

image-20220416160510076

什么结果都不打印

该代码加上括号是这样的

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

注意:

else 自动和距离最近的 if匹配

当if,else if,else 并用时看作是一个语句

2.switch语句

switch语句常用于多分支的情况,因为用 if … else if … else 的形式太复杂

switch(整形表达式){
    case 整形常量表达式1:
        语句1;
    case 整形常量表达式2:
        语句2;
	...
    case 整形常量表达式n:
        语句n:
}

当switch的整形表达式结果和case的整形长量表达式结果相同时,执行语句。

整型常量表达式的不可以是浮点数等数,只可以是整型数字和char类型字符

#include <stdio.h>
int main() {
	int day = 0;
	scanf("%d", &day);
	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;
}

image-20220416160625988

为什么是打印了星期三以及后面的呢,因为case只决定了入口,没有决定出口,所以会把入口后面的语句全部执行。

在switch语句中的break

break就是switch语句的出口

#include <stdio.h>
int main() {
	int day = 0;
	scanf("%d", &day);
	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;
}

image-20220416160700519

注意:

break语句执行后,下一步会跳到switch语句最后的大括号,即跳出switch语句。

default子句

当switch的整形表达式结果和case的整形长聊表达式结果都不相同时,switch语句会被全部跳过,而如果我们想不忽略这件事情,可以加上default子句,该子句是当所有case语句都不执行时,执行default语句。

#include <stdio.h>
int main() {
	int day = 0;
	scanf("%d", &day);
	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;
	default:
		printf("输入星期天数错误\n");
		break;
	}
	return 0;
}

image-20220416160744436

注意:

default可以在switch语句里的任意位置出现,但是一般而且最好的方式是写在最后一条

循环语句

人生总会有非常多的事情需要循环去做,而到达一个限制条件时,该循环就会终止。

1.while循环

while(表达式)
    循环语句;

实战:

#include<stdio.h>
int main() {
	int i = 5;
	while (5 == i)
		printf("hello world!\n");
	return 0;
}

image-20220416160810734

可以看到当while的表达式为真时就会一直打印,只有当表达式为假时,才停止循环。这时就要加一些条件

#include<stdio.h>
int main() {
	int i = 5;
	while (i > 0) {
		printf("hello world!\n");
		i--;
	}
	return 0;
}

image-20220416160845701

break介绍

如果想要不使while表达式为假而跳出循环就要加break

#include<stdio.h>
int main() {
	int i = 5;
	while (i > 0) {
		if (3 == i)
			break;
		printf("hello world!\n");
		i--;
	}
	return 0;
}

image-20220416160917828

当i递减至3时,直接跳出循环

continue介绍

如果想使表达式的一些值打印而一些值不打印时,可以用continue

#include<stdio.h>
int main() {
	int i = 5;
	while (i > 0) {
        i--;
		if (3 == i)
			continue;
		printf("hello world!\n");
	}
	return 0;
}

image-20220416160941066

当i递减至3时,停止下面的运行,重新返回while再开始执行

2.for循环

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

表达式1

表达式1为初始化部分,用于初始化循环变量。

表达式2

表达式2为条件判断部分,用于判断循环时候终止。

表达式3

表达式3为调整部分,用于循环条件的调整。

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

对比for循环和while循环

int i = 0;
//实现相同的功能,使用while
i=1;//初始化部分
while(i<=10)//判断部分
{
printf("hehe\n");
i = i+1;//调整部分
}
//实现相同的功能,使用while
for(i=1; i<=10; i++)
{
printf("hehe\n");
}

可以发现,实现相同功能的两个循环,while循环的三个部分较分散,查找和修改就不够集中和方便。所以for循环更好,实际使用频率也最高。

在for循环中也可以使用break和continue,意义与在while循环中是一样的

3.do . . . while()循环

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

do . . .while相比while要至少执行一次循环,因使用场景有限,很少使用。

goto语句

从理论上来说,goto语句是没必要存在的,因为可以用其它方法容易的写出goto语句的效果,但是存在必有其道理,在有些特定场景下,goto语句更加方便!

#include<stdio.h>
int main() {
begin://一个符号
	printf("hello world\n");
	printf("hello\n");
	goto begin;//跳转到符号处
	return 0;
}

image-20220417183122434

可以看到,程序陷入了死循环,goto语句可以完成循环,但是上面的while、for、do. . .while循环已经完全够用了,goto语句真正的使用场景是如下:

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

goto语句更加方便!

#include<stdio.h>
int main() {
begin://一个符号
	printf("hello world\n");
	printf("hello\n");
	goto begin;//跳转到符号处
	return 0;
}

在这里插入图片描述

可以看到,程序陷入了死循环,goto语句可以完成循环,但是上面的while、for、do. . .while循环已经完全够用了,goto语句真正的使用场景是如下:

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