系列文章目录
速通C语言系列
速通C语言第一站 一篇博客带你初识C语言 http://t.csdn.cn/K43IN
感谢佬们阅读支持!
文章目录
- 系列文章目录
- 前言
- 一、分支语句
- 1 if 语句
- 单分支、双分支
- 多分支
- 悬空else
- 程序员修养艺术
- 2 switch语句
- break语句
- default语句
- continue语句
- 二、循环语句
- 1.while循环
- while循环中的break语句
- while循环中的continue语句
- 2.for循环
- for循环中的break语句
- for循环中的continue语句
- 针对for循环的建议
- 一些for循环的变种
- 3.do……while循环
- do……while循环中的break语句
- do……while循环中的continue语句
- 三 goto语句
- 1 goto语句介绍
- 2 goto语句的优缺点
- 3 实用关机小程序
- 总结
前言
上篇博客我们用一篇博客简单的初识了C语言,其中,我们简单地初识了分支循环.
这篇博客我将细致的介绍分支循环的知识点,带大家速通分支循环。
一、分支语句
回忆我们在初识分支循环的例子,分支语句就是一个选择的语句,接下来我们将具体对其介绍。
1 if语句
随着对条件的筛选更加苛刻,if语句的分支会增加。(单分支、双分支、多分支)。
单分支、双分支
//单分支
if(表达式)
{
语句;
}
//双分支
if(表达式)
{
语句;
}
else
{
语句;
}
多分支
//多分支
if(表达式1)
{
语句1;
}
else if(表达式2)
{
语句2;
}
else
{
语句3;
}
注意:如果你想实现的是条件1满足,条件2也满足;那么要写两个if,而非if 和else if。
(双分支的)例子:我们定义18岁成年,如果小于18岁,就未成年;如果大于等于18岁,就成年。
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
int age = 0;
scanf("%d", &age);
if (age >= 18)
{
printf("成年\n");
}
else
{
printf("未成年\n");
}
return 0;
}
如果我们输入18.
如果我们输入17.
(多分支的)例子:我们定义小于18岁是少年,大于18岁但小于26岁是青年,大于26岁是壮年。
#include<stdio.h>
int main()
{
int age = 0;
scanf("%d", &age);
if (age < 18)
{
printf("少年");
}
else if(age>=18&&age<26)
{
printf("青年");
}
else
{
printf("壮年");
}
return 0;
}
如果我们输入17 如果输入19 如果输入27
悬空else
悬空else是使用if~else中的一个易错点。在介绍之前,我们先给一个例子。
下面这段代码会输出什么呢?hehe还是haha?
int main()
{
int a = 0;
int b = 2;
if (a == 1)
if (b == 2)
printf("hehe");
else
printf("haha");
return 0;
}
结果出乎意料。什么都没打印。为什么呢?
在分支语句中,else和if的匹配符合就近原则。即else会和离它最近的if匹配。所以在上段代码中,if会和第二个else匹配;第一个if单独构成一个分支语句,它的执行语句是下面的if~else。由于a不等于1,所以就不执行下面的语句,所以就不打印任何东西啦。
程序员修养艺术
作为一个程序员,我们要养成良好的代码风格。一定要避免写出"悬空else"这种垃圾代码。
那么要如何避免呢?我们可以在写if和else的时候用大括号来包括语句,这样不仅清晰,VS还会自动帮你对齐if和else。
2 switch语句
switch语句常用于多分支结构。
其结构为
switch(整形表达式)
{
语句项
//(case类型,且case后也必须是整形表达式)
}
我们举一个例子,用数字几来表示星期几。
#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;
}
我们输入1
我们想得到星期一,但却打印出了所有星期。
再输入2
得到了星期二到星期天。
这是为什么呢?
因为他无法跳出来,只能一直执行。
那么如何让它跳出来呢?这就要提到我们接下来要学的break语句和continue语句了。
break语句
我们可以用break来跳出switch语句。
我们将break加入switch语句中。
#include<stdio.h>
int main()
{
int day = 0;
scanf("%d", &day);
switch (day)
{
case 1:
printf("星期一");
break;
case 2:
printf("星期二");
break;
case 3:
printf("星期三");
break;
case 4:
printf("星期四");
break;
case 5:
printf("星期五");
break;
case 6:
printf("星期六");
break;
case 7:
printf("星期天");
break;
}
}
再输入1
注:在后期学预处理时,有一个预处理指令可以在每个case后自动加上break。
default语句
因为一周只有7天,所以我们只能输入1~7。那么如果输入1~7以外的数字呢?所以我们将其余情况归入default语句。
default:
printf("输入错误");
break;
做总结:分支结构中,当分支少时,我们用if~else;当分支多时,我们用switch,但必须用整形表达式。
二、循环语句
1.while循环
while (表达式)
循环语句;
给个例子:打印1~9
#include<stdio.h>
int main()
{
int i = 0;
while (i < 10)
{
printf("%d ", i);
i++;
}
return 0;
}
while循环中的break语句
与分支语句类似,break也可用在循环中,用于中止循环。
我们回到刚才打印1~9的例子。如果我们只想打印1~4,该如何操作呢?
#include<stdio.h>
int main()
{
int i = 1;
while (i < 10)
{
if (5 == i)
{
break;
}
printf("%d ", i);
i++;
}
return 0;
}
while循环中的continue语句
如果将break换成continue,结果会怎样呢?
后面的光标一直在动,说明得到的是1 2 3 4死循环。为什么呢?
continue的作用是跳过本次循环,直接去下一次判断部分,开始下一次循环。
分析:刚开始打印1 2 3 4没问题,当i等于5时,执行continue,continue会跳过下面的printf和i++;
然后再回到while,由于i小于10且i等于5,所以就会一直循环下去。
2.for循环
在对while循环进行分析时,我们不难发现,while循环分为3部分,初始化、判断部分、调整部分。
#include<stdio.h>
int main()
{
int i = 1;//(初始化)
while (i < 10)//(判断部分)
{
printf("%d ",i);
i++;//调整部分
}
return 0;
}
由于三者相距较远,所以调整起来比较麻烦。for循环就解决了这个问题。
for (表达式1; 表达式2; 表达式3)
{ //初始化 //判断 //调整
循环语句;
}
我们尝试用for循环打印1~9
#include<stdio.h>
int main()
{
int i = 1;
for(i=1;i<10;i++)
{
printf("%d ",i);
}
return 0;
}
for循环中的break语句
#include<stdio.h>
int main()
{
int i = 1;
for(i=1;i<10;i++)
{
if (5 == i)
{
break;
}
printf("%d ",i);
}
return 0;
}
for循环中的continue语句
#include<stdio.h>
int main()
{
int i = 1;
for(i=1;i<10;i++)
{
if (5 == i)
{
continue;
}
printf("%d ",i);
}
return 0;
}
由于continue仅能跳过(i==5)的循环,所以打印1~9中除了5的数
针对for循环的建议
1 不可在for循环内修改循环变量,防止for循环失去控制。
#include<stdio.h>
int main()
{
int i = 1;
for(i=1;i<10;i++)
{
printf("%d ",i);
i = 5;//引起混乱
}
return 0;
}
如果不想放在for循环内调整,我们可以将调整部分放到外面。。
#include<stdio.h>
int main()
{
int i = 1;
for(i=1;i<10;)
{
printf("%d ",i);
i++;
}
return 0;
}
2 建议for循环的循环控制变量的取值争取前闭后开写法。
//示例
for(i = 0; i < 10 ;i++)
//闭 //开
一些for循环的变种
判断部分省略--恒为真
#include<stdio.h>
int main()
{
for (;;)
{
printf("张一钢");
}
return 0;
}
初始化的省略
int main()
{
int i = 0;
int j = 0;
for (i = 0; i < 3; i++)
{
for (j = 0; j < 3; j++)
{
printf("张一钢");
}
}
return 0;
}
3*3=9;所以这段代码是打印9次
但如果改为
int main()
{
int i = 0;
int j = 0;
for (; i < 3; i++)
{
for (; j < 3; j++)
{
printf("张一钢");
}
}
return 0;
}
结果就变成了3次
结合调试结果分析:当i=0时,进入j所在的for循环中,循环了3次,i++后等于1,但是j已经变成3了,就进不去j所在的for循环了。所以只打印3次。
3.do……while循环
do
循环语句;
while(表达式);
do……while循环的特点是至少执行一次,这个特点在后期我们实现三子棋和扫雷时将会起到作用。
例子:我们还是用这个循环来打印1~9。
#include<stdio.h>
int main()
{
int i = 1;
do
{
printf("%d ",i);
i++;
}while(i<10);
return 0;
}
do……while循环中的break语句
#include<stdio.h>
int main()
{
int i = 1;
do
{
if (i == 5)
{
break;
}
printf("%d ", i);
i++;
} while (i < 10);
return 0;
}
相同的,break中止循环,所以打印1 2
#include<stdio.h>
int main()
{
int i = 1;
do
{
if (i == 5)
{
continue;
}
printf("%d ", i);
i++;
} while (i < 10);
return 0;
}
打印1 2 3 4后,i此时等于5,continue
跳过本次循环
,i没有++,而是直接跳转到条件判断部分,条件恒成立,于是死循环
。
三 goto语句
1 goto语句介绍
简单来说是一个仅能在一个函数内使用,可进行无条件跳转的语句。
理论上讲goto语句没必要使用,但是在一些情况下会十分好用。
其结构为
跳转标识:
goto 跳转标识;
我们先给一个例子
#include<stdio.h>
int main()
{
flag:
printf("hehe");
printf("haha");
goto flag;
return 0;
}
结果会循环打印hehe haha
当第一次打印hehe和haha后,通过goto语句又回到了flag;所以就再一次打印hehe和haha……所以就成了死循环。
goto语句的优缺点
缺点:可读性太差;而且只能在一个函数使用;而且一般可被替代。
优点:但是遇到多重循环,会非常好用。
例如:
for(...)
{
for(...)
{
for(...)
{
if(disaster)
goto error;
}
}
}
…
error:
if(disaster)
3 实用关机小程序
学编程也要讲究兴趣,下面我们通过实现一个关机小程序来给goto语句提供例子。
(程序运行起来后将在1分钟后关机,如果输入 我是SB 则取消关机)
相关科普:
在电脑中,用system函数执行系统命令,shutdown -s -t用来设置定时关机,其中-s为关机,-t为设置关机时间。shutdown-a用来取消关机。
关于对字符串的比对,我们不能像常量一样用 ==,而是用strcmp函数,同时需引头文件
string.h
直接上代码:
(带注释版)
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main()
{
char input[] = {0};
system("shutdown -s -t 60");//设置关机,60代表60秒
//goto语句的标识符
again:
printf("请注意,你的电脑将在一分钟内关机,输入我是SB,就取消关机\n");
scanf("%s", input);
//判断
if(strcmp(input,"我是SB")==0)
{
system("shutdown -a");//取消关机
}
else
{
goto again;//再给一次机会
}
return 0;
}
不带注释版
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main()
{
char input[] = {0};
system("shutdown -s -t 60");
again:
printf("请注意,你的电脑将在一分钟内关机,输入我是SB,就取消关机\n");
scanf("%s", input);
if(strcmp(input,"我是SB")==0)
{
system("shutdown -a");
}
else
{
goto again;
}
return 0;
}
好啦,快将这段代码分享给朋友吧
总结
做总结,我用这篇博客带大家深入了解了分支与循环。每种分支和循环各有优缺点,在不同情况下我们要用不同分支和循环。水平有限,还请各位大佬指正。如果觉得对你有帮助的话,还请三连关注一波。希望大家都能拿到心仪的offer哦。