今天就花点时间去归纳一下我们常用的基础循环 和 条件判断语句。
不出意外的话所有系列文都是会用C去写。
循环结构
for循环
在c语言里,for循环是一个非常常见的基础语法,具体格式为:
for( a; b; c){d;}
其中 a为初始语句,b为条件语句,c为结束执行语句 ,d为循环体。
具体流程为 a->b->d->c->b->d->c…
在我们看来,有时候的a可以被省略掉,即初始的语句在for语句外就被定义了,下面是一个最基础的打印1-10的c语言源码:
#include<stdio.h>
int main()
{
int i;
for(i=1;i<=10;i++)
printf("%d",i);
}
接下来我们试着把a删除:
#include<stdio.h>
int main()
{
int i;
i=1;
for(;i<=10;i++)
printf("%d",i);
}
同理也可以删除b,c就不再赘述,这是最基础的for循环使用。
while循环
while循环常用于指定数读入(我个人习惯),基本就是在题目要求读入数字n,然后读入n个数据时,使用while循环会比for循环方便很多。while循环的基本格式如下:
while(a){b}
不太一样的是a是判断条件,b是循环体,所以在使用while循环时一般要记住,循环体内要有对判断语句变量的处理,在不执行死循环的目的下,一般的b里是会更改a的判断变量的.
具体执行过程为:a->b->a->b…
下面同样是输出1-10:
#include<stdio.h>
int main()
{
int i;
i=0;
while(i<10)
{
i++;
printf("%d",i);
}
}
当然我最喜欢用的while是这样的,
读入一个数字n,然后读入n个数,打印出这n个数:
#include<stdio.h>
int main()
{
int i,n;
scanf("%d",&n);
while(n--)
{
scanf("%d",&i);
printf("%d\n",i);
}
}
对,细心的也发现了,while循环的判断里也可以对变量本身进行操作,只要操作的返回值不为0,即可执行循环体,所以while循环有一个漂亮的死循环结构:
while(1){}
do-while循环
do-while和while十分类似,具体结构是这样的:
do
{a}
while(b);
当然你也可以写的更好看一点,需要注意的是,do-while循环的while结束后需要加个分号 ; .而在整个do-while的结构里,a、b和while里的正好相反,而循环路径则是a->b->a->b->a…
所以经典的打印1-10可以写成:
#include<stdio.h>
int main()
{
int i;
i=1;
do
{
printf("%d",i);
i++;
}while(i<=10);
}
emmm,仔细看看整个循环过程,感觉用do-while还不如用for,基本框架和执行步骤都差不多,所以一般我们的do-while循环用的会比较少。
结束循环
在循环里,我们通常会碰到需要中途退出的情况,所以基本上我们使用两种方式对循环过程进行处理,就是break和continue。
break语句
break的作用是在循环中退出当前全部循环,他只能用于循环之中,不然编译器会报错,简单的举个🌰,如果输出1-10,但是我不想输出8和8以后的数怎么办,有的人就说了我输出1-7就行了。不,这次我们用break语句写写:
#include<stdio.h>
int main()
{
int i;
for(i=1;i<=10;i++)
{
if(i>=8)break;
printf("%d",i);
}
}
当i=8时,执行了break语句,直接退出了for的循环。在while、do-while、switch语句中同理。
continue语句
continue的作用是退出当次循环,什么意思呢?就是说我想输出1-10,又不想输出8,那么代码如下:
#include<stdio.h>
int main()
{
int i;
for(i=1;i<=10;i++)
{
if(i==8)continue;
printf("%d",i);
}
}
当i=8时,执行了continue语句,退出了当次循环,即循环体不再向下执行,下一步执行的是i++语句,再进行循环判断。
通过对break和continue的对比我们可以看出来,在题目需要对特殊条件筛选时,如果没必要进行不符合条件的循环的循环体的话,可以使用这两个语句进行代码时间和空间的节约,合理使用break和continue,可以更为容易的拿到题目部分点的分。
选择结构
大概我们常用的就下面这三种,具体的使用方式也是十分基础,没什么好说的。
if语句
if语句的结构就是这样:
if(a){b}
其中a为条件,b为执行语句。具体的理解就是满足a条件的时候执行语句b,在不加花括号{}时,if只执行一句话。
其中a的条件判断就很有意思,涉及到了单一条件和多条件,这时候我们会用到&&,||,!等多种链接符号。
if-else语句
if-else语句是if语句的进阶版本,用途更为广泛,具体的结构是这样的:
if(a){b}
else{c}
意思是如果a成立则执行b,否则执行c。
还有一种拓展的用法,就是将if-else进行嵌套链接,是比较常规的用法。比如:
if( a ){b}
else if( c ){d}
else{e}
意思是如果a成立则执行b,否则如果c成立则执行d,否则执行e。这种判断适合执行多种条件判断,在符合特定条件的时候使用可读性更高。当然在执行条件重复的时候可以对判断语句进行&&或者||的处理可以更加优化。
switch语句
switch语句是很少使用的选择语句,他的局限性很高,能选择的变量好像只能是字符和数字,具体格式是:
switch(a)
case … : 操作1
case … : 操作2
default : 操作3
这样子可能看的不太明白,举个例子,读入一个1-5的数字,数字小于等于3打印1,大于3打印2,这种判断在程序可以用if直接写,但在switch中是这样写:
#include<stdio.h>
int main()
{
int i;
scanf("%d",&i);
switch(i)
{
case 1:printf("1");break;
case 2:printf("1");break;
case 3:printf("1");break;
default:printf("2");
}
}
这里的每一个case语句后面都使用了break去退出,原因是不使用break的话,会使程序执行该case语句及下面的break出现之前的所有case语句,所以,我们可以对重复语句进行优化:
#include<stdio.h>
int main()
{
int i;
scanf("%d",&i);
switch(i)
{
case 1:
case 2:
case 3:printf("1");break;
default:printf("2");
}
}
这样可以使代码看起来更加简洁,可读性更高。对switch语句做个总结的话,就是一种人工的枚举法,在写一些简单的系统的时候,可以充当选择的按钮,配合子函数可以让主程序方面看着更容易让人懂,实际上使用起来没有if-else普遍,是一种竞赛中不常用的语句,我们还是得了解他。