19-分支和循环语句_if语句switch语句

19-1 概览

分支语句:if、switch

循环语句:while、for、do while

goto语句

以上都属于控制语句

19-2 语句的分类

C语句可分为以下五类:

表达式语句、函数调用语句、控制语句、复合语句、空语句

19-3 结构

C语言是结构化的程序设计语言

顺序结构:

选择结构:if、switch

循环结构:for、while、do while

19-4 控制语句 

控制语句用于控制程序的执行流程,以实现程序的各种结构方式,它们由特定的语句定义符组成,C语言有九种控制语句,可分为以下三类:

1、条件判断语句也叫分支语句:if语句、switch语句;

2、循环执行语句: do while语句、while语句、for语句;

3、转向语句: break语句、goto语句、continue语句、return语句。

19-5 分支语句(选择结构)

19-5-1 if语句

语法结构:

if (表达式)
	语句;

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

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

注:if语句默认控制一条语句,如果后面跟多条语句,要跟上{};else同理

猜猜会输出什么?

int main()
{
	int age = 10;
	 if(18<=age<28)
	{
		printf("青年\n");
	}
	return 0;
}

运行结果:

为什么10不在这个范围内,还能输出“青年”呢?

因为编译器从左往右判断:18<=age,不正确,为假,所以为0;0<28,正确,所以执行

注意:C语言中0为假,非0为真

所以我们应该这样写:

int main()
{
	int age = 10;
	 if(18 <= age && age < 28)
	{
		printf("青年\n");
	}
	return 0;
}

 不再输出了:

代码块:一对{}就是一个代码块

悬空else

 这个代码会输出什么?

int main()
{
	int a = 0;
	int b = 2;
	if (a == 1)
		if (b == 2)
			printf("hehe\n");
	else
		printf("haha\n");
	return 0;
}

运行结果:

什么都没有?!

其实把这段代码写在VS里面是这样的:

int main()
{
	int a = 0;
	int b = 2;
	if (a == 1)
		if (b == 2)
			printf("hehe\n");
		else
			printf("haha\n");
	return 0;
}

 所以esle是与离它最近的if匹配的

同时,我们也要注意代码风格的规范性,这样的话不仅美观,也便于我们理解

代码规范

1、变量的命名(有意义,规范)

char firstname[20] = 0;  //普通命名
char first_name[20] = 0;  //加下划线
char FirstName[20] = 0;  //首字母大写

2、空格,空行,换行

int a = 10;  //有空格
int a=10;  //无空格

考虑下列代码的输出:

int test()
{
	int a = 1;
	if (a == 1)
		return 1;
	return 0;
}
int main()
{
	int r = test();
	printf("%d\n", r);
	return 0;
}

 输出结果如下:

其实,test函数的意思就是,如果a=1,就返回1;如果a不等于1,就返回0

但是,该函数里并没有else,可能会误导阅读代码的人:无论a是否等于1,都要返回0

所以,我们应该把代码写得尽量规范:

int test()
{
	int a = 1;
	if (a == 1)
		return 1;
	else
		return 0;
}
int main()
{
	int r = test();
	printf("%d\n", r);
	return 0;
}

让编译器指出错误

如果你想要判断是否相等,可以写成这样:

int main()
{
	int num = 2;
	if (5 == num)
	{
		printf("hehe\n");
	}
	return 0;
}

这样如果你不小心少写一个=,编译器会报错:

否则,编译器不会报错,编译器会觉得你在赋值,并没有语法错误

练习

判断一个数是否为奇数

//判断一个数是否为奇数
int main()
{
	int a = 0;
	scanf("%d", &a);
	if (a % 2)
	{
		printf("YES\n");
	}
	else
	{
		printf("NO\n");
	}
	return 0;
}

测试1: 

测试2: 

 输出1-100之间的奇数

代码1

//输出1-100之间的奇数
int main()
{
	int a = 1;
	while (a < 101)
	{
		if (a % 2)
		{
			printf("%d ", a);
		}
		a++;
	}
	return 0;
}

 结果如下:

代码2:

//输出1-100之间的奇数
int main()
{
	int a = 1;
	while (a < 101)
	{
		printf("%d ", a);
		a+=2;
	}
	return 0;
}

19-5-2 switch语句 

当分支过多,if-else语句过于复杂,这个时候可以采用switch语句

语法结构:

switch(整型表达式)
{
    语句项;
}

 注:表达式必须是整型 

语句项:

case 整型常量表达式:
            语句;

 注:表达式必须是整型,并且是常量,字符也是可以的,因为字符对应的ASCII码值是整型常量

代码举例:

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

运行结果:

为什么会出现这种情况呢?

原因:case只决定了入口,不决定出口

switch语句从哪里跳出去呢?

要用break

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

运行结果如下:

 改变要求:

1、输入1-5,输出“weekday”

2、输入6-7,输出“weekend”

我们当然可以直接对上面的进行修改,也可以这样简化,实现多个case匹配同一个语句的效果

int main()
{
	int day = 0;
	scanf("%d", &day);
	switch (day)
	{
	case 1:
	case 2:
	case 3:
	case 4:
	case 5:
		printf("weekday\n");
		break;
	case 6:
	case 7:
		printf("weekend\n");
		break;
	}
	return 0;
}

测试1:

测试2:

编程好习惯:

最后一个break加不加好像都可以,但是还是建议加上,万一以后还要延续呢?这是一个良好的编程习惯。

default

如果表达的值与所有的case标签的值都不匹配怎么办?其实也没什么,结果就是所有的语句都被跳过而已。

程序并不会终止,也不会报错,因为这种情况在C中并不认为是个错误。但是,如果你并不想忽略不匹配所有标签的表达式的值时该怎么办呢?你可以在语句列表中增加一条default子句,把下面的标签:

default:

写在任何一个case标签可以出现的位置。

当switch表达式的值并不匹配所有case标签的值时,这个default子句后面的语句就会执行。

所以,每个switch语句中只能出现一条default子句。

所有case都不能匹配,就会走到default:

int main()
{
	int day = 0;
	scanf("%d", &day);
	switch (day)
	{
	case 1:
	case 2:
	case 3:
	case 4:
	case 5:
		printf("weekday\n");
		break;
	case 6:
	case 7:
		printf("weekend\n");
		break;
	default:
		printf("输入错误!\n");
		break;
	}
	return 0;
}

运行结果:

练习

下列代码的输出是什么?

int main()
{
	int n = 1;
	int m = 2;
	switch (n)
	{
	case 1:m++;
	case 2:n++;
	case 3:
		switch (n)
		{
		case 1:n++;
		case 2:m++; n++;
			break;
		}
	case 4:
		m++;
		break;
	default:
		break;
	}
	printf("m=%d n=%d\n", m,n);
	return 0;
}

结果如下:
 

解释:

int main()
{
	int n = 1;
	int m = 2;
	switch (n)  //n=1,跳到case1
	{
	case 1:m++;  //m=3,没有break,继续向下走
	case 2:n++;  //n=2
	case 3:
		switch (n)  //n=2,跳到case2
		{
		case 1:n++;
		case 2:m++; n++;  //m=4,n=3
			break;  //只是在这个switch里结束了
		}
	case 4:
		m++;  //m=5
		break;
	default:
		break;
	}
	printf("m=%d n=%d\n", m,n);  //m=5 n=3
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值