C语言分支循环语句个人认为比较有意思的几个知识点

如标题,这篇文章不是完全介绍知识点的,想要分享的很杂。

interesting point 1:(switch框架中的有意思的原理)

switch(整形表达式)

{

case 结果1(ps:上面的整形表达式计算出来的):

要执行的语句;

break;

case 结果2(ps:上面的整形表达式计算出来的):

要执行的语句;

break;

……

default:

要执行的语句;

break;

}

有几点要注意一下,switch从哪进,会把后面的也执行,break十分必要,以星期代码为例,

#include <stdio.h>
int main()

{
	int i = 0;
	scanf("%d", &i);
	switch (i)
	{
	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;

}

毕竟我们不想输入1,连着星期二、三、四、五、六、七一起输出来了吧(如果不加上面代码的所有break),这个default 则是应对突发情况的,我们没有星期八,当我们输入8(或其他不合条件的值)时,会输出“输入错误”来提醒我们。

interesting point 2:(char类型的“正负”,顺带一提一个小细节)

signed char c1 = 'A';  // 可以存储 ASCII 码中的 -128 到 127 范围的整数
signed char c2 = -50;  // 负数
signed char c3 = 100;  // 正数
signed char c4 = 0;    // 零

当然,unsigned char 一定是正数了,范围扩大了一倍。

我的理解是:ASCll码从0~31的字符存在,但是我们利用printf函数无法打印出来(32~126可以打印),char类型可以储存负数,但是printf函数找不到一个可以显示的字符与之匹配(负数不在32~126之间),故打印出“?”(你没有看错,就是问号)。

interesting point 3:(关于continue的有趣例子)

continue:在此次循环中跳过continue后面的所有语句,重新开始下一轮循环(如果还有的话),以下例子能帮助我们更好的熟悉continue

#include <stdio.h>
int main()

{
	int i = 1;
	while (i <= 10)
	{
		if (i == 5)
			continue;
		printf("%d ", i);
		i++;
	}
	return 0;

}

本意是输出1 2 3 4 6 7 8 9 10的,结果有个continue,把i++跳过了,while循环彻底卡死,输出1 2 3 4后光标就一直跳动不前了,因为i=5后,就不断的continue跳过后面,再到循环条件满足(5<=10),无限循环了

#include <stdio.h>
int main()

{
	int i = 0;
	for (i = 1; i <= 10; i++)
	{
		if (i == 5)
			continue;
		printf("%d ", i);
	}
	
	return 0;

}

如上为正解,用for循环其中continue就不会把i++给吞了。当while循环使用continue时,一定要注意避免i++跳过造成的死循环。

interesting point 4:(关于goto语句的使用以及整蛊同学小程序doge doge doge)

一般格式:goto next(next也可以用其他的字母代替,比如again)

next(again等等):

goto可以让语句跳转到我们想要跳转的地方

#include <stdio.h>
int main()
{
 printf("hehe\n");
 goto next;
 printf("haha\n");
 
next:
 printf("跳过了haha的打印\n"); 
 return 0;
}

上图为该程序跑出来的结果,至于为什么没有haha,因为跳转到next后,立马执行next后的语句,最后return 0了,程序已经结束了。

goto的逆天作用:

for(...)
{
 for(...)
  {
   for(...)
    {
     if(disaster)
      goto error;
    }
  }
}
error:

让我们试想一下,有三个for循环(如上),如果在最里面的for循环中出现了我们要找的一种情况,我们想让程序停止运行,常规思维是用三个break,现在有了goto,问题就迎刃而解了,只需把要跳转的位置放在三个循环的外面即可。

在这篇文章的最后,我们可以设计一个整蛊同学的程序(禁止恶意伤害别人,该程序仅供学习),该程序功能如下:如果我们不在60秒之内在键盘上输入“我是猪”,电脑会自动关机。

#include <stdio.h>
#include <string.h>
#include <windows.h>
int main()
{
	system("shutdown -s -t 60");
	char shuru[10] = { 0 };
	again:
		printf("注意,你的电脑将在一分钟之内关机,为避免电脑关机,请你输入:我是猪\n");
		scanf("%s", shuru);
		if (strcmp(shuru, "我是猪") == 0)//两个字符串判断相等不能用==哟,使用strcmp若相等,则返回0
		{
			system("shutdown -a");
		}
		else
			goto again;
	
	return 0;
}
#include <stdio.h>
#include <string.h>
#include <windows.h>
int main()
{
	system("shutdown -s -t 60");
	char shuru[10] = { 0 };
	while (1)
	{
		printf("注意,你的电脑将在一分钟之内关机,为避免电脑关机,请你输入:我是猪\n");
		scanf("%s", shuru);
		if (strcmp(shuru, "我是猪") == 0)//两个字符串判断相等不能用==哟,使用strcmp若相等,则返回0
		{
			system("shutdown -a");
			break;
		}
	}
	return 0;
}

这里while循环也可以替代goto。(这个程序好像在VS2010用不了,VS2022社区版可以)

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值