C语⾔是结构化的程序设计语⾔,能够实现的结构分为顺序结构、选择结构、循环结构这三种,本文将对分支语句和循环语句进行初步的介绍
分支语句
if语句
通常结构:
if(表达式)
{
语句1;
}
if(表达式)
{
语句1;
}
else
{
语句2;
}
//多分支
if(表达式)
{
语句1;
}
else if(表达式)
{
语句2;
}
else
{
语句3;
}
在C语言中,0为假,非0表示真,若表达式的结果是0则语句不执行,若不是0则语句执行。
此外,if语句支持嵌套。if后的执行语句只有一句时,可以不用{ }括起来,但当存在多条语句需要执行时,如果不用{ }将语句括起来,就只有第一条语句会被执行,适当的使用{ }可以使代码的逻辑更加清楚。
悬空else
我们知道else语句是与if语句配对的,但是当出现如下情况时:
#include <stdio.h>
int main()
{
int a=0,b=2;
if(a==1)
if(b==2)
printf("bingo");
else
printf("error");
return 0;
}
此代码运行的结果是什么也不输出,原因是什么呢?
当多个if和else存在时,else总是跟最接近的if匹配,虽然上述代码排版看起来else是与第一个if配对的,实际上却是与第二个if配对,从这里我们也能看出,好的代码风格非常重要。
若想让上述代码正常运行,我们可以将其修改为下面这两种形式:
//第一种
#include <stdio.h>
int main()
{
int a=0,b=2;
if(a==1)
{
if(b==2)
printf("bingo");
else
printf("error");
}
return 0;
}
//第二种
#include <stdio.h>
int main()
{
int a=0,b=2;
if(a==1)
{
if(b==2)
printf("bingo");
}
else
printf("error");
return 0;
}
适当的添加大括号,就能有效的提升代码的可读性,让代码的逻辑性更清晰,从而养成良好的代码风格。
switch语句
除了if语句以外,C语言还提供了switch语句来实现分支结构。
switch语句是一种特殊形式的if……else……结构,用于判断条件有多个结果的情况。它把多重的else if改成更易用、可读性更好的形式。
swtich(整型表达式)
{
case value1:语句1;
case value2:语句2;
default:语句3;
}
//case后的值必须是整型常量表达式
需要注意的是,switch中的break语句是非常重要的,只有在case后添加break语句才能够跳出switch语句,否则在该case语句后的其它case语句也会执行,直至遇到其它break语句或switch语句结束,可以说是break语句实现了swtich语句的分支效果。
当然,也不是所有case语句都需要break,应根据实际需求来判断是否加和何时加。
switch语句中的default
在使用switch语句时,有可能会出现表达式的值无法匹配case语句的情况,如果想处理这种情况,就要在switch语句中添加default语句。
顺带一提,在switch语句中,虽然我们通常将default语句放在最后,实际上,case语句和default语句是没有顺序要求的,只要满足实际需求就可以。
循环语句
while语句
C语言提供了三种循环语句,while语句就是其中一种,while语句的语法结构与if语句非常相似,它们的区别就在于while语句能够实现循环。
通常结构:
while(表达式)
{
语句;
}
while语句中的break和continue
break举例:
#include <stdio.h>
int main()
{
int i=1;
while(i<=10)
{
if(i==5)
break;//i等于5时循环终止
printf("%d ",i);
i=i+1;
}
return 0;
}
在添加break语句之前,运行的结果是打印1到10,添加之后的结果是只打印1到4,这是因为break终止了break外的第一层循环,也就是说,当我们想要在某种情况下终止循环时就可以使用break语句来实现终止。
continue举例:
#include <stdio.h>
int main()
{
int i=1;
while(i<=10)
{
if(i==5)
continue;//i等于5时跳过本次循环直接回到判断
printf("%d ",i);//由于continue后的代码也被跳过,所以i一直为5,程序陷入死循环
i=i+1;
}
return 0;
}
由此我们可以得知,continue能让我们跳过本次循环中continue语句后的代码,直接回到循环的判断部分进行下一个循环的判断。需要注意的是,如果循环的调整在continue语句后面,可能会造成程序的死循环。
for语句
for语句是三种循环中使用最多的,for循环的语法形式如下:
for(表达式1;表达式2;表达式3)
{
语句;
}
其中,表达式1用于循环变量初始化;
表达式2用于循环结束条件的判断;
表达式3用于循环变量的调整。
在整个循环过程中,表达式1(初始化部分)只执行一次,然后由表达式2、执行语句、表达式3进行循环。
while循环和for循环的对比
//while循环
#include <stdio.h>
int main()
{
int i=1; //①初始化
while(i<=10) //②判断
{
printf("%d",i);
i=i+1; //③调整
}
return 0;
}
//for循环
#include <stdio.h>
int main()
{
int i=0;
// ①初始化 ②判断 ③调整
for(i = 1;i <= 10;i++)
{
printf("%d",i);
}
return 0;
}
由此可见,相较于while循环,for循环的初始化、判断、调整三部分更集中,更方便后期进行代码维护,因此for循环是要优于while循环的。
for语句中的break和continue
for循环中的break与while循环中的break所起的作用相同,都是直接终止循环,但for循环中的continue与while循环就有所不同了
#include <stdio.h>
int main()
{
int i=1;
for(i=1;i<=10;i++)
{
if(i==5)
continue;//i等于5时跳过本次循环,来到本次循环的调整部分
printf("%d ",i);
}
return 0;
}
上面代码的执行结果是:1 2 3 4 6 7 8 9 10
由于for循环中的调整部分并不写在循环体内,所以continue跳过本次循环的后续语句时返回到的是本次循环的调整部分,然后再进入下一个循环,不会像while循环一样可能导致死循环。
do while语句
在循环语句中,do while语句的使用是最少的,它的语法如下:
do{
语句;
}while(表达式);
while循环和for循环都是先判断再执行,而do while循环是先执行再判断,在do while语句中循环体是至少执行一次的,这是do while语句较为特殊的地方,也是do while语句较少被使用的原因。
do while语句中的break和continue
循环的嵌套
单独的循环语句掌握起来并不难,但解决实际问题时往往是无法只用一次循环就解决的,C语言不仅支持选择语句的嵌套,也支持循环语句的嵌套。在实际应用中,两种嵌套往往是结合使用的。
输出素数便是一道比较经典的例题:
找出100~200之间的素数并打印在屏幕上。
注:素数又称质数,只能被1和本身整除。
要解决这个问题,首先,我们可以通过循环来遍历100到200之间的数;
然后,要判断i是否为素数,需要用2~i-1之间的数来试除,这些数也可以通过循环来产生;
最后,如果2~i-1之间有数字能被i整除,则i不是素数,反之则i是素数。
以下为代码实现:
#include <stdio.h>
int main()
{
int i=0,j=0;
for(i=100;i<=200;i++)
{
for(j=100;j<=i-1;j++)
{
if(i%j==0)
break;
}
if(j>i-1)
printf("%d ",i);
}
return 0;
}
其实素数的判断并不需要遍历到i-1,只需要遍历到根号i就可以了,代码实现如下:
#include <stdio.h>
#include <math.h>
int main()
{
int i=0,j=0;
for(i=100;i<=200;i++)
{
for(j=100;j<=sqrt(i);j++)
{
if(i%j==0)
break;
}
if(j>sqrt(i))
printf("%d ",i);
}
return 0;
}
goto语句
C语言提供了一种很特别的语法,即goto语句和跳转标号。goto语句可以实现在同一函数中跳转到设置好的标号处。例如:
#include <stdio.h>
int main()
{
printf("1");
goto next;
printf("2");
next:
printf("跳过了2的打印");
return 0;
}
需要注意的是,goto语句如果使用不当,就会造成函数内部胡乱调转,所以一般不建议使用,不过goto语句也有它的优点,比如在多层循环嵌套中想要快速跳出循环时,虽然break可以实现跳出循环,但一个break只能跳出一层循环,多层嵌套的情况下,使用goto语句最为便捷。