目录
分支语句
-
if
-
switch
循环语句
-
while
-
for
-
do while
goto语句
1. 什么是语句?
C语句分为5类:
-
表达式语句
-
函数调用语句
-
控制语句
-
复合语句
-
空语句
控制语句用于控制程序的执行流程,以实现程序的各种结构方式。它们由特定的语句定义符组成,C语言有9种控制语句。
可分为以下三类:
-
条件判断语句(分支语句):if语句、switch语句;
-
循环执行语句:do while语句、while语句、for语句;
-
转向语句:break语句、goto语句、continue语句、return语句。
C语言是结构化的程序设计语言。
结构化体现在如下图:
2. 分支语句(选择结构)
2.1 if语句
语法结构
//单分支
if(表达式) //表达式结果为真或者非0,则执行下面语句
语句;
//双分支
if(表达式)
语句1;
else
语句2;
//多分支
if(表达式1)
语句1;
else if(表达式2)
语句2;
else
语句3;
#include <stdio.h>
int main()
{
int a = 10;
if (a = 3)
printf("hehe\n"); //hehe,赋值
return 0;
}
#include <stdio.h>
int main()
{
int a = 10;
if (a == 3)
printf("hehe\n"); //不打印,判断
return 0;
}
#include <stdio.h>
int main()
{
int age = 20;
if (age > 18)
printf("成年\n"); //成年
return 0;
}
#include <stdio.h>
int main()
{
int age = 20;
if (age < 18)
printf("未成年\n");
else
printf("成年\n");
return 0;
}
//成年
#include <stdio.h>
int main()
{
int age = 20;
if (age < 18)
printf("未成年\n");
printf("不能饮酒\n");
else
printf("成年\n");
return 0;
}
//error
#include <stdio.h>
int main()
{
int age = 20;
if (age < 18)
{
printf("未成年\n");
printf("不能饮酒\n");
}
else
{
printf("成年\n");
}
return 0;
}
//成年
如果需要控制多条语句必须要添加{},否则error或者逻辑错误。
这里的一对{ }就是一个代码块。
#include <stdio.h>
int main()
{
int age = 10;
scanf("%d",&age);
if (age < 18)
printf("青少年\n");
else if (age >= 18 && age < 40)
printf("青年\n");
else if (age >= 40 && age <= 100)
printf("老年\n");
else
printf("老寿星\n");
return 0;
}
如果表达式的结果为真,则语句执行。
在C语言中如何判断真假?0表示假,非0表示真。
案例:强调代码风格(前面也有说过一点)
无输出,else是和它离得最近的if匹配的
- 变量的命名(有意义,规范)
- 空格、空行、换行
推荐一本书:高质量C++/C编程指南(看前三章)
如果常量和变量进行比较,最好把常量放在左边,以免写错编译器不报错。
2.2 switch语句
switch语句常用于多分支的情况。
switch(整型表达式)
{
语句项;
}
语句项就是一些case语句。
case 整型常量表达式:
语句;
输入1,输出星期一;输入2,输出星期二···
#include <stdio.h>
int main()
{
int day = 0;
scanf("%d",&day);
if (1 == day)
printf("星期1\n");
else if (2 == day)
printf("星期2\n");
else if (3 == day)
printf("星期3\n");
else if (4 == day)
printf("星期4\n");
else if (5 == day)
printf("星期5\n");
else if (6 == day)
printf("星期6\n");
else
printf("星期日\n");
return 0;
}
输入1,输出星期一;输入2,输出星期二···
#include <stdio.h>
int main()
{
int day = 0;
scanf("%d",&day);
switch (day)
{
case 1:
printf("星期1\n");
break;
case 2:
printf("星期2\n");
break;
case 3:
printf("星期3\n");
break;
case 4:
printf("星期4\n");
break;
case 5:
printf("星期5\n");
break;
case 6:
printf("星期6\n");
break;
case 7:
printf("星期日\n");
break;
}
return 0;
}
case 字符 也可以,字符存储的是ASCII码,ASCII码也是整型常量。
//改变需求,输入1-5,输出地是"weekday";输入6-7,输出"weekend"
#include <stdio.h>
int main()
{
int day = 0;
scanf("%d",&day);
switch (day)
{
case 1:
case 2:
case 3:
case 4:
case 5:
printf("weekday\n");
break;
case 6:
case 7:
printf("weekend\n");
break;
}
return 0;
}
#include <stdio.h>
int main()
{
int day = 0;
scanf("%d",&day);
switch (day)
{
case 1:
case 2:
case 3:
case 4:
case 5:
printf("weekday\n");
break;
case 6:
case 7:
printf("weekend\n");
break;
default:
printf("选择错误\n");
}
return 0;
}
switch语句可以嵌套使用。
break语句会跳出它所在的switch语句。
3. 循环语句
-
while
-
for
-
do while
3.1 while循环
while语句执行的流程:
while(表达式)
循环语句;
#include <stdio.h>
int main()
{
while(1)
{
printf("hehe\n");
}
return 0;
}
//一直循环打印hehe
//打印1-10数字
#include <stdio.h>
int main()
{
int i = 1;
while (i <= 10)
{
printf("%d ", i);
i++;
}
return 0;
}
break
//break跳出循环
#include <stdio.h>
int main()
{
int i = 1;
while (i <= 10)
{
if (5 == i)
{
break;
}
printf("%d ", i);
i++;
}
return 0;
}
//1 2 3 4
continue
//执行continue时,跳出本次while循环中continue后的代码,直接进行while条件的判断
#include <stdio.h>
int main()
{
int i = 1;
while (i <= 10)
{
if (5 == i)
{
continue;
}
printf("%d ", i);
i++;
}
return 0;
}
//1 2 3 4 死循环一直与while的条件表达式进行判断
#include <stdio.h>
int main()
{
int i = 1;
while (i <= 10)
{
i++;
if (5 == i)
{
continue;
}
printf("%d ", i);
}
return 0;
}
// 2 3 4 6 7 8 9 10 11
while循环中的break是用于永久的终止循环。
continue跳过本次循环后面的代码,直接去判断部分,进行下一次循环的判断。
清理缓冲区
#include <stdio.h>
int main()
{
//EOF; //双击,转到定义,查看值为-1,整型,char类型大小是1个字节放不下-1,所以下面定义类型为int,end of file
int ch = getchar(); //w,getchar()获取一个字符,将其ASCII码值放在变量ch内
printf("%c\n", ch); //w
putchar(ch); //w,putchar()打印字符
return 0;
}
MSDN:微软开发者网站
//用于清理缓冲区
#include <stdio.h>
int main()
{
int ch = 0;
while ((ch = getchar()) != EOF) //getchar每次从缓冲区里读取一个字符
{
putchar(ch); //a
}
return 0;
}
//ctrl+c停止程序
//举例
#include <stdio.h>
int main()
{
char password[20] = { 0 };
printf("请输入密码:>");
scanf("%s",password); //输入123456
getchar(); //读取\n
printf("请输入密码(Y/N):>");
int ret = getchar();
if ('Y' == ret)
{
printf("Yes\n");
}
else
{
printf("No\n");
}
return 0;
}
//getchar和scanf一样都不是从键盘上读取字符,而是从输入缓冲区里面读取。
//刚开始输入123456回车(其中回车就是\n)
//然后输入缓冲区接收到键盘输入的数据,等待getchar或scanf来读取
//scanf读取了123456,剩下\n,getchar就会读取,导致用户还没输入程序就中止了
//所以中间添加了getchar读取\n
//但是这种方式并不严谨,因为有时候需要清理的不止一个字符,而是一堆字符,详解如下
scanf读取空格之前的字符,遇到空格就停止读取。
#include <stdio.h>
int main()
{
char password[20] = { 0 };
printf("请输入密码:>");
scanf("%s",password); //输入123456
//getchar(); //读取\n
//清理缓冲区的一堆字符
int ch = 0;
while ((ch = getchar()) != '\n')
{
;
}
printf("请输入密码(Y/N):>");
int ret = getchar();
if ('Y' == ret)
{
printf("Yes\n");
}
else
{
printf("No\n");
}
return 0;
}
//只打印数字字符,跳过其它字符
#include <stdio.h>
int main()
{
char ch = '\0';
while ((ch = getchar()) != EOF)
{
if (ch < '0' || ch > '9')
continue;
putchar(ch);
}
return 0;
}
3.2 *for循环-用得最多
引入while循环的缺陷
//打印1-10 while循环
#include <stdio.h>
int main()
{
int i = 1; //初始化
while (i <= 10) //判断
{
printf("%d ", i);
i++; //调整
}
return 0;
}
//上面影响循环的三个部分,当相隔较远时,修改其中一个部分改变此循环容易出现bug
for(表达式1;表达式2;表达式3)
循环语句;
表达式1为初始化部分,用于初始化循环变量的。
表达式2为条件判断部分,用于判断循坏什么时侯终止。
表达式3为调整部分,用于循环条件的调整。
//打印1-10 for循环
#include <stdio.h>
int main()
{
int i = 0;
for (i = 1; i <= 10; i++)
{
printf("%d ", i);
printf("hehe\n");
}
return 0;
}
//循环语句不止一句时请使用{}
break
break只能跳出一个循环,如果存在嵌套循坏,每层都需要一个break才能全部跳出。
#include <stdio.h>
int main()
{
int i = 0;
for (i = 1; i <= 10; i++)
{
if (i == 5)
break;
printf("%d ", i);
}
return 0;
}
//1 2 3 4
continue
#include <stdio.h>
int main()
{
int i = 0;
for (i = 1; i <= 10; i++)
{
if (i == 5)
continue;
printf("%d ", i);
}
return 0;
}
//1 2 3 4 6 7 8 9 10
对比while循环
建议
- 不可在for循环体内修改循环变量,防止for循环失去控制。
- 建议for语句的循环控制变量的取值采用“前闭后开区间”写法。
//不可在for循环体内修改循环变量,防止for循环失去控制
#include <stdio.h>
int main()
{
int i = 0;
for (i = 1; i <= 10; i++)
{
if (i == 5)
continue;
printf("%d ", i);
i = 12;
}
return 0;
}
//1
具体视情况而定。
for循环的变种
省略判断部分
for循环的判断部分省略意味着判断会恒成立。
#include <stdio.h>
int i = 0;
for (;;)
{
printf("hehe\n");
}
//死循环
#include <stdio.h>
int i = 0;
int j = 0;
for (i = 0; i < 3; i++)
{
for (j = 0; j < 3; j++)
{
printf("hehe\n");
}
}
//打印9行hehe
//3*3=9
省略初始化值
#include <stdio.h>
int i = 0;
int j = 0;
for (; i < 3; i++)
{
for (; j < 3; j++)
{
printf("hehe\n");
}
}
//打印3行hehe,再次循环时j没有初始化值,会使用上次跳出二层循环的j=3这个值
#include <stdio.h>
for (int i = 0; i < 10; i++)
{
printf("hehe\n");
}
//打印10行hehe
C99语法才支持上面这种写法int i = 0。
C++中支持这种写法。
//循环0次,因为不是判断,是赋值,表达式2判断为0,则为假,直接跳出循环。改为2个等号,是比较,循环1次
#include <stdio.h>
int main()
{
int i = 0;
int k = 0;
for (i = 0, k = 0; k = 0; i++, k++)
k++;
return 0;
}
3.3 do···while循环
do
循环语句;
while(表达式);
场景:循环至少执行一次,上来就干循环语句。使用场景有限,不经常使用。
//打印1-10
#include <stdio.h>
int main()
{
int i = 1;
do
{
printf("%d ", i);
i++;
}
while (i <= 10);
return 0;
}
break
#include <stdio.h>
int main()
{
int i = 1;
do
{
if (i == 5)
break;
printf("%d ", i);
i++;
}
while (i <= 10);
return 0;
}
//1 2 3 4
#include <stdio.h>
int main()
{
int i = 1;
do
{
i++;
if (i == 5)
break;
printf("%d ", i);
}
while (i <= 10);
return 0;
}
//2 3 4
continue
#include <stdio.h>
int main()
{
int i = 1;
do
{
i++;
if (i == 5)
continue;
printf("%d ", i);
}
while (i <= 10);
return 0;
}
//2 3 4 6 7 8 9 10 11
//跳过printf,再次进行判断
#include <stdio.h>
int main()
{
int i = 1;
do
{
if (i == 5)
continue;
printf("%d ", i);
i++;
}
while (i <= 10);
return 0;
}
//1 2 3 4 死循环
//continue,判断;continue,判断···
4. goto语句
C语言提供了可以随意滥用的goto语句和标记跳转的标号。
从理论上goto语句是没有必要的,实践中没有goto语句也可以很容易的写出代码。
但是某些场合下goto语句还是用得着的,最常见的用法就是终止程序在某些深度嵌套的结构的处理过程。
例如:一次跳出两层或多层循环。
多层循环这种情况使用break是达不到目的的。它只能从最内层循环退出到上一层的循环。
#include <stdio.h>
int main()
{
again:
printf("hehe\n");
printf("haha\n");
goto again;
return 0;
}
//死循环,goto不能跨函数跳转
真正适合goto语句使用的场景
for (···)
for (···)
{
for (···)
{
if (disaster)
goto error;
}
}
···
error:
//处理错误情况
//关机程序
//1、电脑运行起来后,1分钟内关机
//2、如果输入:我是猪,就取消关机
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
char input[20] = { 0 };
system("shutdown -s -t 60"); //stdlib.h
again:
printf("请注意你的电脑在60秒内关机,如果输入:我是猪,就取消关机\n");
scanf("%s", input);
if (strcmp(input, "我是猪") == 0) //string.h
{
system("shutdown -a");
}
else
{
goto again;
}
return 0;
}
循环替代goto语句
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
int main()
{
char input[20] = { 0 };
system("shutdown -s -t 60");
while (1)
{
printf("请注意你的电脑在60秒内关机,如果输入:我是猪,就取消关机\n");
scanf("%s", input);
if (strcmp(input, "我是猪") == 0)
{
system("shutdown -a");
break;
}
}
return 0;
}
本周就暂且更新至此吧,期待下周再会。如有错误还请不吝赐教。