如标题,这篇文章不是完全介绍知识点的,想要分享的很杂。
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社区版可以)