从所周知,C语言是一种结构化的程序设计语言,其中的结构包括顺序结构、选择结构、循环结构。
我们可以通过分支语句和循环语句来实现选择结构与循环结构。
分支语句:if语句、switch语句
循环语句:while语句、do...while语句、for语句
1.分支语句:
1.1 if语句:
1.1.1基本语法形式
当表达式结果为真时,执行语句;表达式结果为假时,则不执行语句。
值得注意的是,在C语言中,非0表示真,0表示假!!!
举个例子:
#include<stdio.h>
int main()
{
int a = 1;
if (a == 1)//a = 1,括号里的表达式结果为真,执行下面的printf语句
{
printf("呵呵\n");
}
return 0;
}
结果如下图:
1.1.2 else
先举个例子,然后解释。
//这是一段判断奇偶数的代码
#include<stdio.h>
int main()
{
int number = 0;
scanf("%d", &number);//输入一个数字
if (number % 2 == 0)//当一个数字能被2整除时,说明这个数是偶数。(运算符 % 表⽰求模运算,即返回两个整数相除的余值。)
{
printf("%d是偶数\n", number);
}
else//当一个数字不是偶数时,那它只能是奇数。
{
printf("%d是奇数\n", number);
}
return 0;
}
从上面的例子中我们不难看出,当if()里的表达式不成立(结果为假时),就会执行else下包含的语句。换句话说,就是else语句对应的是if语句中条件判断的相反情况。
1.1.3 多重分支(多重选择)与嵌套if语句
如果说把if...else比作一个人来到一个路口,他只有两条路可以走,要么走if路,要么走else路,他只有两种选择。
而else if语句可以让这个人拥有更多条路可以走,并且嵌套if可以在一条路上开辟更多的道路。
举个例子:
#include<stdio.h>
int main()
{
int num = 0;
scanf("%d", &num);//输入一个数字
if (num > 0)//在输入的数字大于0的情况下,再去判断该数字是奇数还是偶数
{
if (num % 2 == 0)
printf("%d是偶数\n", num);
else
printf("%d是奇数\n", num);
}
else if (num == 0)//输入的数字等于0的情况下
printf("%d既不是正数也不是负数\n", num);
else//输入的数字小于0的情况下
printf("%d是负数\n",num);
return 0;
}
相信通过上面的例子,大家应该可以理解多重分支与嵌套if语句。
需要值得注意的是,在默认情况下,无论是if语句还是else语句,都只控制一条语句,如果想要其控制两条语句,就必须加{}将其括起来!!!(敲重点,这很重要)
还有一个重点知识需要关注的是悬空else的问题,大家可以想想如果有多个else语句和if语句,那么它们之间是怎样配对的呢?
答案就是:else 总是跟最接近的 if 匹配。
我们来看看下面的例子:
大家可以看到,这段代码什么也没有输出,这是为什么呢?
记住!else 总是跟最接近 的 if 匹配。所以,这段代码中的else语句是跟if(b==1)语句配对,它们作为一个整体,嵌套在第一个if语句。当a=0时,a == 3表达式的结果为假,第一个if语句不成立,那么下面的if...else语句自然没有机会执行。
最后再强调一遍:else 总是跟最接近的 if 匹配。
大家务必记住这条规则!!!
1.2 switch语句:
1.2.1基本语法形式
switch语句会根据expression中不同的值,来执行相对应的case分支,如果没有相应的case分支,则执行default分支。(case与default没有顺序要求,只是一般我们把default放在最后面)
在上面的代码中,expression必须是整型表达式,value必须是整型常量表达式。
1.2.2 switch语句中的break语句
在switch语句中,我们使用break语句跳出当前switch语句,如果一个case语句中的后边没有break语句,程序则会往下按顺序执行另外的case语句。
具体情况可看下面例子:
因为每个case分支中的语句后边没有加break语句,导致程序从case 0开始往下依次执行case 1、case 2分支中的语句。
显然这不是我们想要的效果,这时我们加上break语句看看。
当我们加上break语句时,结果就大不一样了。
虽然break语句在switch语句中很重要,但这并不意味着我们得在每个case语句后边加上break语句。
请看下面的例子:
总的来说,我们得根据实际需要来在case语句后边加上break语句。
2.循环语句:
2.1 while循环:
2.1.1 基本语法形式
while(表达式)
{
语句;
}
首先,当程序执行到while这里后,会根据表达式的值来判断是否进去while循环。表达式的值为0,不执行while循环语语句;表达式的值为非0,则会进去while循环,执行循环语句。
每次执行完循环语句后,都会重新判断表达式的值,以此决定是否继续执行循环语句。
我们通过一个简单的例子来看看while循环。
可以看到当表达式为1时,就会无限次执行循环语句,持续不断地打印”呵呵“。
由此可见,在实际写代码过程中,我们要设置好while循环的条件,不然就可能导致代码死循环。
接下来,我们看下while循环具体的应用:打印数字1-10。
2.2 do...while循环
2.2.1 基本语法形式
{
语句;
}while(表达式);
do...while循环跟while循环是比较相似的,do...while循环会先执行一次循环语句,再去判断表达式的值,以此决定是否继续执行循环语句。
do...while循环跟while循环相比,它至少会执行一次循环语句,而while循环可以不执行。
我们再来打印一下数字1-10。
可以看出,两次代码的差别不大。
do...while循环在实际写代码过程中使用频率较少,因为只有在循环体⾄少被执⾏⼀次的场景下,do...while循环才能发挥作用。
2.3 for循环
2.3.1 基本语法形式
for(表达式1;表达式2;表达式3)
{
语句;
}
表达式1:用于循环变量的初始化
表达式2:用于判断循环是否结束
表达式3:用于调整一次循环后的变量
for循环的执行流程:首先执行表达式1,对循环变量进行初始化;然后执行表达式2,其结果为0,结束循环,结果不为零,则执行循环语句;接着执行表达式3,进行循环变量的调整。然后执行表达式2,根据其结果判断是否继续执行循环。
所以表达式1整个循环只会执行一次,然后都是表达式2,循环语句,表达式3在循环。
可以借助流程图帮助理解
我们还是举打印数字1-10的例子。
3.break语句和continue语句:
在执行循环时,当某个特殊条件出现时,我们希望提前结束循环。此时break语句和continue语句就派上用场了。
break语句:用于永久终止循环,当程序执行break语句后,立即结束循环。
continue语句:跳过此次循环continue后边的代码。
break语句在三种循环的效果基本一致,所以只举一个for的例子。
当i == 6时,跳出循环,6及6后面的数字就不打印的了。
接下来我们看看continue语句在三种循环的区别。
当i == 6时,执行continue,跳过了continue后面的代码,直接来到了i++这步,所以打印的数字少了6。
上面的while和do...while的情况类似,当i == 6后,就执⾏continue,直接跳过continue的代码,去循环的判断的地⽅,但是由于跳过了i++,i一直为6,这时代码就陷入了死循环。
由此可知,对于continue语句的使用要谨慎,当调整循环变量的表达式在continue后面,continue将其跳过,直接来到循环变量判断的部分,此时就有可能导致代码死循环。
这次就先写到这里了,因为是第一次写体量大的博客,可能会有许多不足的地方,还请看到这篇博客的有缘人见谅了,我也非常欢迎大家的建议与指正。
感谢观看,我们下一篇博客见!!!