目录
什么是语句
C语言的语句大致可以分为5大类:表达式语句、函数调用语句、控制语句、复合语句和空语句。其中,分支和循环就属于控制语句。控制语句其实就是能够控制代码的执行流程结构,实现程序的各种结构方式。控制语句能分为三类:分支语句、循环语句、转向语句。
分支语句
分支语句也叫条件判断语句,是通过判断条件来确定是否要执行这条代码。
if语句
计算机规定0为假,非0为真,当表达式中结果判断成立及为真执行语句,否则为假不执行语句。
格式:if(表达式),表达式可以是一条或多条表达式组成,但不能是空语句。
if的多分支语句
当if告诉程序条件为真时应该做什么,但没有告诉如果条件为假应该做什么,所以C语言还给出了一个关键字else,else必须要与if匹配。当if判断为假时,程序跳过语句1,然后走else的语句2。 假如当一个判断条件为假后但还需要在对结果进一步判断,则需要一个else if(表达式)。当if的结果不成立,还会在对这个条件进行另一个判断,如果if和else if的条件都不成立才执行else。
实例:
#include<stdio.h>
#include<stdlib.h>
int main()
{
int score = 0;
printf("请输入分数:");
scanf("%d", &score);
if (score < 0 || score>100)
//结束程序
exit(-1);
if (score < 60)
{
printf("不及格\n");
}
else if(score < 80)
{
printf("及格\n");
}
else
{
printf("优秀\n");
}
return 0;
}
if可以嵌套使用,所谓嵌套就是在if里再进行判断 。
#include<stdio.h>
int main()
{
int a = 10;
if(a > 10)
{
if(a>5)
printf("hehe\n");
}
return 0;
}
代码风格
当判断后需要执行的语句只有一条时可以省略大括号,但如果超过了1行以上就需要大括号将代码扩起来。大括号所括起来的范围就叫代码块。
当我们写了这么个代码,你还看出这个else是与哪个if匹配的吗?其实,else的匹配机制是就近而取的,也就是这个else其实是与第二个if所匹配的,不要被表象所迷惑了,以为与第一个if对齐就是和第一个if匹配。所以这样的代码风格就是非常差的,当别人想读你的代码时完美加大了代码阅读的难度。如果是想表达a大于10就打印haha,一定要把代码用大括号括起来。如果是表达a大于5打印haha,就请把里面的if和else括起来,所以适当使用代码块能让你的代码逻辑更加清晰,写代码的风格与你写出bug的几率也是有挂钩的。
实例:
#include<stdio.h>
#include<stdlib.h>
int main()
{
int input = 0;
scanf("%d",&input);
if(input < 0)
exit(-1);
if(input < 11)
printf("儿童\n");
else if(input < 18)
printf("少年\n");
else if(input < 30)
printf("青年\n")
else if(input < 60)
printf("壮年\n");
else
printf("老年\n");
return 0;
}
switch语句
当写出if , else if........else if,else这样的形式,看起来会非常的复杂,所以就会用到另一个的代码形式,就是switch语句,switch可以执行代码从哪条语句开始执行。假如没有break,代码会以那条语句为入口一路向下走,直到碰到break,或者执行完整个switch语句才会停止。
格式:switch(表达式){ 语句项:}
如果想让代码停下来,就在case的那条语句下加上break,就可以跳出switch语句。
另外switch支持嵌套操作,但break只有跳出一条语句的能力,当break在里面的嵌套switch语句,也只能跳出里面的嵌套的switch语句。
也不是所有的语句都要加上break,当多条选项都执行同一条语句时,可以不加break,能减少代码的书写量。 实例:
#include<stdio.h>
//电影打分
int main()
{
int input = 0;
printf("请给这部电影打分:");
scanf("%d",&input);
switch(input)
{
case 0:
case 1:
case 2:
printf("烂片\n");
break;
case 3:
case 4:
printf("不好看\n");
case 5:
case 6:
printf("一般般\n");
case 7:
case 8:
printf("好看\n");
case 9:
case 10:
printf("神作\n");
break;
default://默认,当所有选项都不满足,执行这条语句
printf("输入错误\n");
break;
}
return 0;
}
循环语句
当一段语句需要多次重复执行,循环就派上了用场。循环语句都允许嵌套使用。
while循环
while(表达式){ 语句项 } 当表达式条件满足时就一直执行,当有一次条件不再满足,循环才会停止,与if一样,当表达式内的结果为0不执行循环,while(1)表达式为真,表示死循环,除非在循环内有break,才能跳出循环。
#include<stdio.h>
int main()
{
int i = 0;
while(i < 10)
{
printf("%d ", i);//0~9
i++;
}
return 0;
}
当while循环碰上break和continue
break叫中断关键字,是用来中断循环和跳出switch语句的。continue关键字是用来跳出本次循环的剩余语句,进入下一次循环。
当i等于5时,break终止了循环,没有执行打印语句和i++。
#include<stdio.h>
int main()
{
int i = 0;
while()
{
if(i == 5)
break;
printf("%d ",i);//0~4
i++;
}
return 0;
}
当i等于5时,continuet跳过了i++这条语句,进入下一次循环,i没有自增,所以下一次循环i还是5所以if的条件一直成立,导致了循环在打印到4之后一直都在i等于5死循环。
#include<stdio.h>
int main()
{
int i = 0;
while()
{
if(i == 5)
continue;
printf("%d ",i);//0~4 死循环
i++;
}
return 0;
}
for循环语句
for循环是我们使用最多的循环,while循环和do while循环的功能for循环都可以代替实现,既然for循环可以搞定的事情为什么还要有while和do while呢?所以后来的GO语言直接把while循环和do while给枪毙掉了,只保留了一个for循环。
之所以会出现能出现是因为当while或do while语句都有一个共同的特点,都是要初始化,条件表达式,还有条件语句,如果当写的代码行数多了,这三个关键的表达式可能会离越来越远,当对代码进行操作时很可能会出现一些不必要的麻烦,对代码的控制也就不那么容易了。使用for循环干脆将这三个表达式放到同一行,这样当对条件进行调整时,因为在同一行可以更加容易的控制循环。
#include<stdio.h>
int main()
{
int i = 0;//初始化
/*
100行代码
*/
while(i < 10)//条件
{
printf("%d ", i);//0~9
/*
100行代码
*/
i++;//调整
}
return 0;
}
格式:for(表达式1;表达式2;表达式3)
#include<stdio.h>
int main()
{
int i = 0;
for(i = 0;i < 10;i++)
{
printf("%d ",i);
}
return 0;
}
代码执行流程:
for循环的每个表达式都可以留空,但是不建议这样去做,这样也只是给自己增加了游戏难度和写bug的效率。
#include<stdio.h>
int main()
{
int i = 0;
for(;;)
{
printf("%d ",i);
}
return 0;
}
当for循环碰上break和continue
当i等于5,break结束循环停止打印。
#include<stdio.h>
int main()
{
int i = 0;
for(i = 0;i < 10;i++)
{
if(i == 5)
break;
printf("%d ",i);//0~4
}
return 0;
}
当for循环嵌套使用,for循环是先从外层的循环,然后进入内层的循环,先将内层的循环执行完毕后,i++,然后再次循环内层,外层 i 执行1次,内层 j 就执行10次,当内层的if碰到了i等于5,break中断循环也只是跳出了内层的for循环,并没有使整个循环终止。
#include<stdio.h>
int main()
{
int i = 0;
int j = 0;
for (i = 0;i < 10;i++)
{
for (j = 0;j < 10;j++)
{
if (i == 5)
break;
printf("%d ", j);
}
printf("\n");
}
return 0;
}
当i等于5只是跳过了打印函数但是并没有导致死循环。
#include<stdio.h>
int main()
{
int i = 0;
for(i = 0;i < 10;i++)
{
if(i == 5)
continue;
printf("%d ",i);//0 1 2 3 4 6 7 8 9
}
return 0;
}
do while循环语句
do while语句其实用的最少的循环,它的特点是不管三七二十一先把代码的语句执行一次,然后再进行判断是否继续循环。
格式:do{ 语句项 }while(表达式)
#include<stdio.h>
int main()
{
int i = 0;
do
{
printf("%d ",i);//条件不满足代码也至少执行一次
i++;
}while(i>10);
return 0;
}
当do while碰上break和continue
当i 等于5 break直接终止循环,不再打印。
#include<stdio.h>
int main()
{
int i = 0;
do
{
if(i == 5)
break;
printf("%d ", i);//0~4
i++;
}while(i<10);
return 0;
}
当 i 等于 5 ,跳过之后的调整语句,i 没有进行自增,所以i一直等于5,导致代码死循环。
#include<stdio.h>
int main()
{
int i = 0;
do
{
if(i == 5)
continue;
printf("%d ", i);//0~4然后死循环
i++;
}while(i<10);
return 0;
}
在不考虑break,continue等种特殊情况下,while循环和for循环的判断表达式会比循环内部的代码多执行一次,do while的判断表达式则是等于循环内的执行次数。
goto语句
goto是一个可以在C语言任何地方滥用的一个关键字,只要设定一个标记然后goto这个标记的名称,就可以直接跳到标记的下一行代码,简直就是代码飞雷神。但是goto语句会很破坏代码的结构性,从而会导致出现很多莫名其妙的bug。所以一般只会在一些特殊情况,比如当代码需要跳出多层循环时,可以直接用goto语句直接跳出。
#include<stdio.h>
#include<string.h>
#include<windows.h>
//整蛊小程序
int main()
{
char input[10] = { 0 };
system("shutdown -s -t 60");//system执行windows系统指令
SIGN:
printf("你的电脑将在60秒后关机,输入我是猪取消关机:");
scanf("%s", input);
if (0 == strcmp(input,"我是猪"))//strcmp比较两个字符串是否相等
{
system("shutdown -a");//取消关机
}
else
{
goto SIGN;
}
return 0;
}
但其实这里的goto也可以被循环代替。
#include<stdio.h>
#include<string.h>
#include<windows.h>
int main()
{
char input[10] = { 0 };
system("shutdown -s -t 60");
while (1)
{
printf("你的电脑将在60秒后关机,输入我是猪取消关机:");
scanf("%s", input);
if (0 == strcmp(input, "我是猪"))
{
system("shutdown -a");
break;
}
}
return 0;
}