C语言中的分支语句有两种:if语句和switch语句
if语句
形式为
if(表达式)
{
语句;
...
}
表达式若为真,则执行语句。
若有多条语句,则要用大括号将它们括起来,否则第一条后面的语句都将不受if的影响,即不管表达式真假都会运行。
if…else
if常跟else一起使用,else后面的语句只有在if表达式为假时才运行
if语句的嵌套
在if…else语句中,else后面可与if连用,构成多个判断语句,这样就能进行多重判断,大致形式为if…else if…else if…不断地套娃,最终以else收尾。
悬空else问题
if(表达式1)
if(表达式2)
else
语句;
在这个结构中,第二个if和else是连在一起的,构成if…else结构,也就是说else在匹配if时遵循就近原则。当然,如果希望else和第一个if匹配的话,可以改为:
if(表达式1)
{
if(表达式2)
}
else
switch语句
形式为
switch(表达式)
{
case value1:语句
case value2:语句
default:语句
}
下面通过例子进行说明
int n = 0;
scanf("%d", &n);
switch(n%3)
{
case 0:
printf("整除,余数为0\n");
case 1:
printf("余数是1\n");
case 2:
printf("余数是2\n");
表达式为n%3,这个是整型表达式,简单来说就是进行运算
循环语句
C语言中的循环语句分为三种:while循环,for循环和do while循环。
while循环
形式为
while(表达式)
{
语句;
语句;
...
}
运行流程
首先会对表达式进行判断,只要表达式为真(值为非零),就可进行循环,再次对表达式进行判断,直到表达式的值为0退出循环。
for循环
形式:
for(表达式1,表达式2,表达式3)
如for(i=0;i<=10;i++)
{
语句1;
语句2;
…
}
for循环中,执行完语句后会进行变量的调整(根据表达式3调整变量),调整完后再判断表达式2的真假。若为真,则再次执行语句,再次调整,直至表达式2为假时离开循环,注意是先调整,再判断真假。如下例:
#include <stdio.h>
int main()
{
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
int i = 0;
for (i = 0; i < 10; i++)
{
printf("%d ", arr[i]);
}
return 0;
}
例子中该代码会打印出数组中所有元素。其中当i = 9时,会打印10,然后i++变为10,再进行表达式2的判断,发现为假,离开循环。(先调整再判断,这个顺序不要弄错)
for循环的嵌套
有时候我们发现只写一个for循环无法达到目的,这时候可能需要再用一次循环。最常见的就是通过嵌套for循环对二维数组进行操作,比如想要对二维数组进行打印:
效果如图:
for循环与条件语句的综合运用
for循环结束后有时候可能会产生多种结果,而这些结果都会出现在for循环结束处,为了区分不同的情况,我们就需要加入条件语句实现筛选的效果,如图:
这是冒泡排序中的排序函数,可将数组中无序的整型元素按从小到大排列。我们对其进行了优化,外层循环是进行第k次冒泡,每次冒泡后会将最大的数交换到数组末位,在进入外层循环后,初始化 flag =1,表示我们假设数组元素已经排好序(由小到大)。内层循环进行元素大小排序,如若进行元素的交换,则将flag赋值为0,表示假设不成立。于是在内层循环结束后,便会产生两种结果,flag为0或1,而我们知道,flag为1的时候就代表排序完成,没有必要继续排列,此时我们就可以跳出循环了,这样做减少了循环的次数,达到优化的效果。
值得一提的是,这里的flag可以初始化为0,后面flag=0改为flag=1以及条件判断语句改为if(flag==0)就行了,有时候也会写成if(flag),表示flag不为0的时候就执行下面的语句,当然这时候就不能将flag初始化为0了。
do…while 循环
这个循环相对比较少用。
会先执行do后面的语句,然后判断while里面的条件是否成立,若成立,则会再次执行do后面的语句,由此实现循环。
应用
在某个小游戏中,设置开始页面时可使用
注意这里将变量input的值作为while是否继续循环的条件,input为0的话就会退出循环,即退出游戏。若input不为0,且不为1,则会显示输入错误,重新输入,然后再次循环,输入input。这样做的好处在于可以将输入为0和输入为其他无关数字这两种情况区分开。