第7讲 - C语言关键字(7)

我们先来讲一下switch case语句

int main()
{
	int a = 0;
	while (1)
	{
		printf("qing shu ru shuzi\n");
		scanf("%d", &a);
		switch (a)
		{
		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;
}

我们知道,任何具有判断能力的语法结构,都必须具有:判定和分支功能

switch case语句也同样相同:switch case语句中,case充当判定功能,break充当分支功能,switch(),括号内部的元素必须为整型或者整型表达式:注意:short char等都是整型

我们知道,case语句充当判定功能,那么break是如何充当分支功能呢?

我们对代码进行修改:我们把周一到周三的break语句去除掉

int main()
{
	int a = 0;
	while (1)
	{
		printf("qing shu ru shuzi\n");
		scanf("%d", &a);
		switch (a)
		{
		case 1:
			printf("星期一\n");
		case 2:
			printf("星期二\n");
		case 3:
			printf("星期三\n");
		case 4:
			printf("星期四\n");
			break;
		case 5:
			printf("星期五\n");
			break;
		case 6:
			printf("星期六\n");
			break;
		case 7:
			printf("星期日\n");
			break;
		}
	}
	return 0;
}

我们进行编译,输入1

我们可以发现,结果出现星期一 二三 四,原因是什么?

答:switch case语句中的break起到了分支功能,如果没有break,case 1 2 3 4中的语句就会混淆在一起,所以break起到了分支功能

第二点:switch语句记得要加上default,default的意思是假如以上条件全部不满足,就执行default语句

第二个问题,能否在case语句和break之间创建变量

答:不能,例如

int main()
{
	int a = 0;
	while (1)
	{
		printf("qing shu ru shuzi\n");
		scanf("%d", &a);
		switch (a)
		{
		case 1:
			int b = 10;
			printf("星期一\n"); 
			printf("星期一\n");
			printf("星期一\n");
			printf("星期一\n");
            printf("%d\n", b);
			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;
}

 我们在case 1和break之间初始化代码创建变量b,进行运行,

 代码报错,那么如何正确书写呢?

我们直接在case语句内部加上花括号即可

int main()
{
	int a = 0;
	while (1)
	{
		printf("qing shu ru shuzi\n");
		scanf("%d", &a);
		switch (a)
		{
		case 1:
		{
				  int b = 10;
				  printf("星期一\n");
				  printf("星期一\n");
				  printf("星期一\n");
				  printf("星期一\n");
				  printf("%d\n", b);
				  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;
}

如何写出多条case语句执行同一个语句的代码?例如case1到5运行时打印结果周内,case6到7运行时打印结果周末

答:很简单,我们只需要删掉case1到case4的全部内容,在case5语句的内部写出我们所要执行程序的结果,case6 和7也同理

int main()
{
	int a = 0;
	while (1)
	{
		printf("qing shu ru shuzi\n");
		scanf("%d", &a);
		switch (a)
		{
		case 1:
	
		case 2:
		case 3:
		case 4:
		case 5:
			printf("周内\n");
			break;
		case 6:
		case 7:
			printf("周末\n");
			break;
		default :
			printf("你输入的日期有误,请重新输入\n");
			break;
		}
	}
	return 0;
}

我们进行运行

 注意:default语句不一定全部都要放在末尾,default语句可以放在switch语句内部的任意位置,并不会影响代码的逻辑执行顺序

如何使用switch case语句在我们想要中断的case语句部位中断?

int main()
{
	int b = 0;
	while (!b)
	{
		printf("qing shu ru shuzi\n");
		int a = 0;
		scanf("%d", &a);
		switch (a)
		{
		case 1:
	
		case 2:
			 b = 1;
		case 3:
		case 4:
		case 5:
			printf("周内\n");
			break;
		case 6:
		case 7:
			printf("周末\n");
			break;
		default :
			printf("你输入的日期有误,请重新输入\n");
			break;
		}
	}
	return 0;
}

如代码所示,我们首先创建变量b,变量b=0,我们的while循环判断语句内容是!b,b=0,在逻辑上是否的意思,!b在逻辑上是是的意思,我们进入循环,在想要终止的case语句内部把b初始化为1,那么!b的结果就是0,退出循环。

我们都知道,case 语句后面的是常量,我们的const修饰的常变量能否直接作为case语句的判断条件呢?

答:我们写代码来进行检测

int main()
{
	const int a = 10;
	switch (1)
	{
	case a:
		printf("4");
		break;
	default :
		break;
	}
	return 0;
}

我们进行编译,代码报错

所以 const修饰的长变量是不能直接当作case的判断条件的,case语句的判断条件必须是严格意义上的整型

那么宏定义的可以吗?

答:我们进行检测

#define A 10
int main()
{
	 int a = 10;
	switch (a)
	{
	case A:
		printf("4");
		break;
	default :
		break;
	}
	
}

我们进行编译

所以宏定义的变量是能够被当作case语句的判定条件的 

注意:我们在排列case语句时,可以通过case语句的执行频率来排列case语句 ,也就是最常执行的放在最前面,最少执行的放在最后面

for死循环该如何书写

int main()
{
	for ( ; ; )
	{
		printf(".");
		
	}
	return 0;
}

我们进行编译

 在任何c程序中,在默认编译好之后,都有三个输入输出流

stdin:标准输入      文件名是FILE*STDIN  ,对应的是键盘

stdout :标准输出    文件名FILE*STDOUT ,对应的是显示器

stderr:标准错误    文件名是FILE*STDERR  ,对应的是显示器

现阶段的学习,我们只需要记住就可以

 getchar需要注意的一些事项

getchar会接受键盘上的回车键,会把他默认为换行符

例如

int main()
{
	while (1)
	{
		int c = getchar;
		if (c == '#')
		{
			break;
		}
		printf("%c\n", c);
	}
	return 0;
}

因为我们的getchar识别键盘上的回车键作为换行符,又因为我们打印时,又写了一个换行,所以程序运行时,会隔两行

 所以我们在调用getchar函数时,不用换行分割符,因为getchar自身就会识别我们回车键给的换行符

我们去掉我们自己加上的换行符后

代码就恢复正常了 

第二个注意事项

我们知道,getchar接受的是字符,为什么返回的要是整型呢?

答:假如我们输入成功,没什么两样,假如我们输入失败,因为我们char的类型的有效数字是0到255,换算成二进位制就是0000 0000到1111 1111,假设我们的错误对应的二进位制是10000 0000,那么我们在返回时,只能返回后八位,也就是0000 0000,那么在编译器看来,我们输入的值仍在合法范围内,输入依旧成功

 注意:我们在键盘中输入的内容,或者显示器打印的内容全部都是字符

我们进行验证

int main()
{
	int ret=printf("%d", 1234);
	printf("%d", ret);
	return 0;
}

我们进行编译

 我们可以发现,printf实际上是字符,我们输入了四个数字,所以就是四个字符

例如

int main()
{
	int a = 0;
	scanf("%d", &a);
}

假设我们输入的数字是1234,那么实际上,输入的是四个字符,这四个字符是1,2,3,4

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值