时间过得可真快,距离上一次写博客已经过了一个月了。这一个月事儿可真是太多了,终于迎来了这美好的可以安静写博客的机会(其实就是为自己偷懒找的借口)。
那废话不多说,之后我们还是要好好学习,好好写博客。
今天带来的是C语言初阶的分支与循环。
目录:
2.3.3 do...while循环中的break和continue
这一部分那就主要是分支语句和循环语句,分支语句包括:if else语句,switch选择语句。循环语句包括:while循环语句,for循环语句,do while循环语句。最后还有goto语句。
那什么是语句呢?
C语句可以分为以下五类:1.表达式语句 2.函数调用语句 3.控制语句 4.复合语句 5.空语句。
这里可以简单的提一下: 控制语句用于控制程序的执行流程,以实现程序的各种结构方式,它们由特定的语句定义符组成。
C语言有九种控制语句,可分为以下三类:
1. 条件判断语句也叫分支语句:if语句、switch语句;
2. 循环执行语句:do while语句、while语句、for语句;
3. 转向语句:break语句、goto语句、continue语句、return语句。
一、分支语句 (选择结构)
不同的选择有不同的结果,C语言也一样,不同的选择,代码执行情况也会不同。就和做选择题一样,给几个选项,对号入座。(最简单的理解,好好学习,走上人生巅峰;那不学习,就只能家里蹲呗)
1.1 if语句
1.1.1 if语句语法结构
不管怎么样,首先先了解语法结构是什么样的。(得知道是咋用的吧)
请看:
如果表达式的结果为真,则语句执行,0表示假,非0表示真。
以下三种方式都可以使用,根据不同的场景选择不同的方式。
第一种:
int main()
{
int n = 0;//定义一个变量
scanf("%d", &n);//输入
if (n % 2 == 0)//判断是否为偶数
{
printf("偶数");//输出
}
return 0;
}
第二种:
int main()
{
int n = 0;//定义一个变量
scanf("%d", &n);//输入
if (n % 2 == 0)//判断是否为偶数
{
printf("偶数\n");//输出
}
else
{
printf("奇数\n");//不是偶数就是奇数
}
return 0;
}
第三种:
int main()
{
int n = 0;//定义
scanf("%d", &n);//输入
if (n == 0)//判断
{
printf("为0\n");
}
else if (n > 0)
{
printf("正数\n");
}
else
{
printf("负数\n");
}
return 0;
}
这里是我的一个小习惯,不管是if,else if还是else后面我都习惯加上大括号再写代码,既美观,又可以增加代码的可读性,这样写也可以避免一些问题的出现,比如悬空else。
1.1.2 悬空else
这段代码正确的理解应该是这样
int main()
{
int a = 0;
int b = 0;
if (1 == a)
{
if (2 == b)
{
printf("hehe\n");
}
else
{
printf("haha\n");
}
}
return 0;
}
这就是悬空else的问题,else匹配是else和它离的最近的且还没有匹配的if匹配。
这只是一种理解方式,大括号加在不同的位置会有不同的效果。
还是那句话,我建议,加括号!加括号!加括号!
总的来说,if有很多书写形式
(2)这种形式更加整洁美观,代码可读性高。
(4)这种最大的区别就是括号里的写法,(=)的意思是赋值,(==)的意思是判断是否相等
这里缺少了一个=,但是程序还是跑过去了,但会有一个警告。
这样写一旦缺了一个=,程序会直接报错,根本就跑不过去,避免因为忘了加=产生的bug。
1.2 switch语句
switch语句也是一种分支语句,常用于多分支的语句,分支了,用if语句就非常麻烦了。
比如:
输入1,输出星期一
输入2,输出星期二
输入3,输出星期三
输入4,输出星期四
输入5,输出星期五
输入6,输出星期六
输入7,输出星期日
这样用if语句用起来就非常麻烦。
1.2.1 switch语句语法结构
它的语法形式
上述例子可以这样写:
int main()
{
int day = 0;
scanf("%d", &day);//输入1——7会对应输出
switch(day)
{
case 1:
printf("星期一\n");
break;//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;
}
还可以换一种形式:
int main()
{
int day = 0;
scanf("%d", &day);
switch(day)
{
case 1:
case 2:
case 3:
case 4:
case 5:
printf("工作日\n");//输入1——5,输出工作日
break;//break作用是跳出分支语句,实际是把语句列表划分为不同的分支部分
case 6:
case 7:
printf("休息日\n");//输入6、7,输出休息日
break;
}
return 0;
}
根据我们的需求可以变换代码的形式。
由以上例子可知,
在最后一个 case 语句的后面加上一条 break语句,之所以这么写是可以避免出现在以前的最后一个 case 语句后面忘了添加 break语句。
1.2.2 default子句
用于表达式的值与所有的 case 标签的值都不匹配的情况。
其实也没什么,结构就是所有的语句都被跳过而已。
程序并不会终止,也不会报错,因为这种情况在 C 中并不认为是个错误。
但是,如果你并不想忽略不匹配所有标签的表达式的值时该怎么办呢?
可以在语句列表中增加一条 default 子句,把下面的标签
default :
写在任何一个 case 标签可以出现的位置。
当 switch 表达式的值并不匹配所有 case 标签的值时,这个 default 子句后面的语句就会执行。
所以,每个 switch 语句中只能出现一条 default 子句。
但是它可以出现在语句列表的任何位置,而且语句流会像执行一个 case 标签一样执行 default 子句。
所以在每个 switch 语句中都放一条default子句是个好习惯,甚至可以在后边再加一个 break。
二、循环语句
2.1 while循环
循环语句,顾名思义就是语句可以执行多次,if语句当条件满足的情况下,该语句只会执行一次,但会有同一件事需要我们去执行多次的情况,这里就需要用到循环语句。
第一种while循环
2.1.1 while循环语法结构
这里简单画了一个图(第一次画,有点丑,别介意)
2.1.2 while循环语句执行流程
while语句执行的流程图:(表达式 == expr)
下面有一个简单的代码,来计算n的阶乘的和
int main()
{
int n = 0;//定义
scanf("%d", &n);//输入
int j = 1;//阶乘,乘法需要设成1
int m = 0;//每个阶乘的和
int tmp = n;//把n存在tmp中,下面的n的值会变
while(tmp)
{
n = tmp;
j = 1;//重置j的值
while (n)
{
j *= n;//计算阶乘
n--;
}
m += j;//计算阶乘的和
tmp--;
}
printf("%d\n", m);//输出和
return 0;
}
这种方法也许不是最简便的,这里只提一种,简单介绍while循环语句的用法。
2.1.3 while语句中的break和continue
这里先介绍一下break这个关键字,它不仅可以在循环语句中使用,分支语句等都可以使用,那必定是有使用它的意义。
其实在循环中只要遇到break,就停止后期的所有的循环,直接终止循环。
所以while中的break是用于永久终止循环的。
这里的break它的作用是不执行该循环体break下面的语句,直接跳出循环体,所以该程序的输出结果是:1 2 3 4 。
int main()
{
int i = 1;
while(i<=10)
{
if(i == 5)
break;
printf("%d ", i);
i++;
}
return 0;
}
continue在while循环中的作用是:
continue是用于终止本次循环的,也就是本次循环中continue后边的代码不会再执行,
而是直接跳转到while语句的判断部分,进行下一次循环的入口判断。
int main()
{
int i = 1;
while (i <= 10)
{
if (i == 5)
continue;
printf("%d ", i);
i++;
}
return 0;
}
2.2 for循环
介绍完while循环,那再来说一下for循环,for循环也是我用的最多的,也是最方便的一个循环语句。
2.2.1 for循环语法结构
//在屏幕上打印1——10的数字
int main()
{
int i = 0;
for (i = 1; i <= 10; i++)
{
printf("%d ", i);
}
return 0;
}
2.2.2 for语句执行流程
for语句执行的流程图:
由此观之,对比一下for循环和while循环,for循环在编写的时候更加简洁,更加方便,查找修改集中,所以for循环的使用频率也更高。
2.2.3 for循环中的break和continue
当然,在for循环中也可以使用break和continue,它们的意义和while循环中相差不大,这里就不过多介绍了,但还是有一定的差异。
break:
int main()
{
int i = 0;
for (i = 1; i <= 10; i++)
{
if (i == 5)
break;
printf("%d ", i);
}
return 0;
}
continue:
int main()
{
int i = 0;
for (i = 1; i <= 10; i++)
{
if (i == 5)
continue;
printf("%d ", i);
}
return 0;
}
2.2.4 for语句的循环控制变量
建议:
1. 不可在for 循环体内修改循环变量,防止 for 循环失去控制。
2. 建议for语句的循环控制变量的取值采用“前闭后开区间”写法。
这里稍微提一下,for循环后面的括号中的三个表达式是可以省略的,可以这样写,但不建议这样,容易导致出现一些问题。如果省略掉,for循环判断条件恒为真。
2.3 do...while() 循环
2.3.1do...while语句的语法
do...while语句执行的流程:
2.3.2 do..while语句的特点
不管三七二十一,循环至少执行一次,使用的机会比较少,所以不常用。
int main()
{
int i = 10;
do
{
printf("%d\n", i);
} while (i < 10);
return 0;
}
如果在编译器上执行,屏幕上会直接打印10,i=10,判断条件i<10这个一开始就是错的,但do...while语句会直接执行一次,再开始判断,所以直接打印一个10。
2.3.3 do...while循环中的break和continue
用途差不多,也就不过多说明了,直接呈上下面两段代码
break:
int main()
{
int i = 10;
do
{
if (5 == i)
break;
printf("%d\n", i);
} while (i < 10);
return 0;
}
continue:
int main()
{
int i = 10;
do
{
if (5 == i)
continue;
printf("%d\n", i);
} while (i < 10);
return 0;
}
三、goto语句
C语言中提供了可以随意滥用的 goto 语句和标记跳转的标号。 从理论上 goto 语句是没有必要的,实践中没有 goto 语句也可以很容易的写出代码。 但是某些场合下goto 语句还是用得着的,最常见的用法就是终止程序在某些深度嵌套的结构的处理过程。
例如:一次跳出两层或多层循环。
多层循环这种情况使用 break 是达不到目的的。它只能从最内层循环退出到上一层的循环。
代码如下:
for (...)
{
for (...)
{
for (...)
{
if (...)
goto to;
}
}
…
}
to :
if (disaster)
…
结语:
那关于C语言的分支与循环就介绍完了(完结撒花)。之后也会分享更多的有关C语言的内容,尽请期待。