前面介绍了初识C语言相关内容,这篇博客开始将正式对C语言的每一个章节进行深入学习,这篇主要讲解分支语句和循环语句!!!
本篇博客所学习的分支语句和循环语句主要依附于控制语句,所以何为控制语句?
前面初识C语言中我们举过这样一个例子,好好学习就可以拿一个好offer,摆烂的话你就得回家种地,这就是一种选择,不同的选择就会有不同的结果,在C语言中,这种不同的结果则会对应执行不同的语句(或代码块)。
今天让我们一起来学习两种分支语句:if语句和switch语句。
语法结构:1. if ( 表达式 )语句 ;2. if (表达式 )语句 1 ;else语句 2 ;3. // 多分支if ( 表达式 1 )语句 1 ;else if ( 表达式 2 )语句 2 ;else语句 3 ;
代码示例分别如下:
1.
2.
3.
注意:其中在写else if中的条件时,一定要用&&这个操作符,假设你写成(18
如果条件成立,要执行多条语句,应该使用代码块。
此时编译会发生错误,因为执行多条语句时,应使用大括号,改正如下:
以后在敲代码时,应该养成这种习惯,不管是一条语句还是多条语句,我们都要带上大括号,这样不仅不会出现错误,而且会增加我们的代码在逻辑上的可读性。
我们一起来考虑一下这个代码的运行结果,大部分人可能都会这么想a = 0,不满足第一个if条件,则会执行与其对应的else里面的语句打印出haha,让我们一起来看一下编译结果:
#include
int main()
{
int a = 0;
int b = 2;
if(a == 1)
if(b == 2)
printf("hehe\n");
else
printf("haha\n");
return 0; }
结果什么也没有输出,这是为什么呢?当出现这种悬空的else时,首先匹配距离其最近的if,所以这里的else与第二个if匹配,当不满足第一个if的条件时会直接退出程序。这个例子也更加证明前面提到的书写大括号这个习惯的重要性!
改正如下:
int main()
{
int a = 0;
int b = 2;
if (a == 1)
{
if (b == 2)
printf("hehe\n");
}
else
{
printf("haha\n");
}
return 0;
}
若加上大括号,此时结果就会输出haha。
前面的例子当我们遇到多个条件时,会一直重复书写else if,为了避免这种复杂形式我们就会采用switch语句。
switch ( 整型常量表达式 ){语句项;}语句项:// 是一些 case 语句:// 如下:case 整形常量表达式 :语句 ;
int main()
{
int day = 0;
scanf("%d",&day);
switch(day)
{
case 1:
printf("星期一\n");
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;
}
有时候我们的需求变了:
#include
int main()
{
int n = 1;
int m = 2;
switch (n)
{
case 1:
m++;
case 2:
n++;
case 3:
switch (n)
{//switch允许嵌套使用
case 1:
n++;
case 2:
m++;
n++;
break;
}
case 4:
m++;
break;
default:
break;
}
printf("m = %d, n = %d\n", m, n);
return 0;
}
答案:m = 5,n = 3,自行考虑!
小练习2:
int func(int a)
{
int b;
switch (a)
{
case 1: b = 30;
case 2: b = 20;
case 3: b = 16;
default: b = 0;
}
return b;
}
此时fun(1) = ?
答案为:0;
注意:在没有break语句中跳出switch时,switch中的任何语句都需要执行(包括default语句),其中default与case语句没有先后顺序。
C语言中我们主要学习三个循环,分别为:while 循环for 循环do while 循环
我们都知道if语句,满足条件时会执行,否则不执行,但是整个语句只能执行一次;由于我们发现生活中很多的实际的例子是:同一件事情我们需要完成很多次。那我们怎么做呢? C语言中给我们引入了: while 语句,可以实现循环。
while ( 表达式 )循环语句 ;
int main()
{
int i = 1;
while (i <= 10)
{
printf("%d ", i);
i++;
}
return 0;
}
我们只需要在while的判断语句中加上条件,然后每次打印后让i++就可以了。
break
//break 代码实例
#include
int main()
{
int i = 1;
while(i<=10)
{
if(i == 5)
break;
printf("%d ", i);
i = i+1;
}
return 0;
}
此时结果为1 2 3 4,i=5时执行break语句会跳出循环,所以break的作用就是跳出整个循环,是永久的。
continue
//continue 代码实例1
#include
int main()
{
int i = 1;
while(i<=10)
{
if(i == 5)
continue;
printf("%d ", i);
i = i+1;
}
return 0;
}
此时结果为1 2 3 4后面死循环,是因为continue只是跳出本次循环后面的语句,直接跳转到while语句的判断部分,进行下一次循环的入口判断。
//continue 代码实例2
#include
int main()
{
int i = 1;
while(i<=10)
{
i = i+1;
if(i == 5)
continue;
printf("%d ", i);
}
return 0;
}
该编译结果自行理解。
continue在while循环中的作用就是:continue是用于终止本次循环的,也就是本次循环中continue后边的代码不会再执行,而是直接跳转到while语句的判断部分。进行下一次循环的入口判断。
for ( 表达式 1 ; 表达式 2 ; 表达式 3 )循环语句 ;表达式 1表达式 1 为 初始化部分 ,用于初始化循环变量的。表达式 2表达式 2 为 条件判断部分 ,用于判断循环时候终止。表达式 3表达式 3 为 调整部分 ,用于循环条件的调整。
类比于前面的while循环,我们都知道使用while循环时,需要先定义一个初始变量,然后while的括号需要写入判断条件,出while循环时也需要写调整语句;那么同样for循环也需要,只不过for循环把这三个部分的语句整合在了一个括号内。 那我们如何用for循环在屏幕上打印1-10的数字呢?如下:
int main()
{
int i = 1;
for (i = 1; i <= 10; i++)
{
printf("%d ", i);
}
return 0;
}
其中for(i=1/*初始化*/; i<=10/*判断部分*/; i++/*调整部分*/)
对比for循环和while循环
int i = 0;
//实现相同的功能,使用while
i=1;//初始化部分
while(i<=10)//判断部分
{
printf("hehe\n");
i = i+1;//调整部分
}
//实现相同的功能,使用while
for(i=1; i<=10; i++) {
printf("hehe\n");
}
break
int main()
{
int i = 0;
for(i=1; i<=10; i++)
{
if(i == 5)
break;
printf("%d ",i);
}
return 0;
}
结果为1 2 3 4,i= 5时遇到break语句直接跳出循环,所以break的作用就是跳出整个循环,是永久的。
continue
int main()
{
int i = 0;
for(i=1; i<=10; i++)
{
if(i == 5)
continue;
printf("%d ",i);
}
return 0;
}
此时结果为1-10没有5,同while循环不同是因为i=5时,continue会跳过后面的代码,但是i++语句并没有跳过,所以i++之后=6进入for循环继续执行打印操作。
1. 不可在 for 循环体内修改循环变量,防止 for 循环失去控制。2. 建议 for 语句的循环控制变量的取值采用 “ 前闭后开区间 ” 写法。
1.示例:
此时编译会出现死循环是因为在for循环体内加了一句i=0这个控制语句,造成每次进入循环时i始终等于1,所以不可在for 循环体内修改循环变量,防止 for 循环失去控制。
2.
int i = 0 ;// 前闭后开的写法for ( i = 0 ; i < 10 ; i ++ ){}// 两边都是闭区间for ( i = 0 ; i <= 9 ; i ++ ){}第一种写法更容易看出需要循环10次,逻辑上更容易被理解
1.
int main()
{
//代码1
for(;;)
{
printf("hehe\n");
}
//for循环中的初始化部分,判断部分,调整部分是可以省略的,但是不建议初学时省略,容易导致问
题。
因为没有控制语句,会默认for循环的判断语句恒成立,此时会死循环打印hehe,故写for循环时最好不要省略。
2.
1.
int main()
{
int i = 0;
int j = 0;
//这里打印多少个hehe?
for (i = 0; i < 3; i++)
{
for (j = 0; j < 3; j++)
{
printf("hehe\n");
}
}
return 0;
}
2.
int mian()
{
int i = 0;
int j = 0;
//如果省略掉初始化部分,这里打印多少个hehe?
for (; i < 3; i++)
{
for (; j < 3; j++)
{
printf("hehe\n");
}
}
return 0;
}
来比较两个代码,分别会打印多少个呵呵?
第一个代码打印了9个hehe,因为外面三次循环,里面三次循环,所以一共3*3 = 9次循环,故打印9次hehe;
第二个代码为什么只打印了三个hehe呢?那是因为当i= 0进入第二个for循环时,内层循环j会一直++,当j=3时退出内层循环打印了三个hehe,但是此时j=3,当i++等于1时,j=3不满足第二个for循环的条件不会进入内层循环,故只打印了三个hehe。所以我们在书写代码时尽量不要省略初始条件!!!
do循环语句 ;while ( 表达式 );
int main()
{
int i = 10;
do
{
printf("%d\n", i);
} while (i < 10);
return 0;
}
虽然此时i=10不满足while里面的条件,但是do语句的特点至少执行一次,故输出10。
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;
}
从编译结果可以看出,break和continue的结果都是10(同while语句类似),读者自行理解,不做过多赘述 。
狂肝将近6000字,希望读者可以耐心看完,那么循环和分支语句的介绍到这里,后面我会出一篇关于本章的相关题目以加强读者的理解,然后我们就得开启函数学习的篇章了,烦请点个关注和收藏,我们一起继续努力,加油!!!