目录
前言:
流程控制是学习C语言的第一个重点,它分为顺序结构、选择结构和循环结构。
什么是流程控制?
简单来说就是程序执行代码的顺序。
1.顺序结构
顺序结构是最基础简单的,只有简单的输入和输出。
1.1 printf( )输出
printf( ) 的作⽤是将参数⽂本输出到屏幕。
#include<stdio.h>
int main()
{
printf("hello world!");
return 0;
}
1.2 scanf( )输入
scanf( ) 函数⽤于读取⽤⼾的键盘输⼊。
当我们有了变量,我们需要给变量输⼊值就可以使⽤ scanf 函数,如果需要将变量的值输出在屏幕上的时候可以使⽤ printf 函数。
#include <stdio.h>
int main()
{
int score = 0;
printf("请输⼊成绩:");
scanf("%d", &score);
printf("成绩是:%d\n", score);
return 0;
}
scanf() 原型定义在头⽂件 stdio.h 。 scanf( ) 的语法跟 printf( ) 类似。
//注意:变量前⾯必须加上 & 运算符(指针变量除外),因为 scanf() 传递的不是值,⽽是地址, 即将变量 i 的地址指向⽤⼾输⼊的值。 如果这⾥的变量是指针变量(⽐如字符串变量),那就不⽤加 & 运算符。
2.选择结构
选择
定义:某些代码可能执行,也可能不执行,有选择地执行某些代码。
分类:if、switch
2.1 if
1) if 最简单的用法
if (表达式)
语句;
功能:表达式成⽴(为真),则语句执⾏,表达式不成⽴(为假),则语句不执⾏ 。
// 在C语⾔中,0为假,⾮0表⽰真,也就是表达式的结果如果是0,则语句不执⾏,表达式的结果如果不是0,则语句执⾏。
2) if 的范围问题
if(表达式)
语句A;
语句B;
if 默认只能控制语句A的执行与否,无法控制语句B的执行与否;或者说语句B一定执行。
if(表达式)
{
语句A;
语句B;
}
此时 if 可控制语句A和语句B。
由此可见:if 只能控制一个语句的执行与否,如果想控制多个语句,就要把这些语句用{}括起来。
3) if···else···的用法
if(表达式)
语句A;
else
语句B;
// 默认在 if 和 else 中默认都只控制⼀条语句
4)if···else if···else···的用法
if (表达式1)
语句A;
else if (表达式2)
语句B;
else if (表达式3)
语句C;
else
语句D;
5)if 常见问题解析
//空语句的问题
if (9 > 6) ;
//等价于
if (9 > 6)
; //这是一个空语句
if (表达式1)
语句A;
else
语句B;
//这是正确的
if (表达式1);
语句A;
else
语句B;
//这是错误的
if (表达式1)
语句A;
else if (表达式2)
语句B;
else if (表达式3)
语句C;
else
语句D;
//即使表达式1和2都成立,也只执行A语句
if (表达式1)
语句A;
else if (表达式2)
语句B;
else if (表达式3)
语句C;
//这样写语法没问题,但是逻辑上有漏洞
if (表达式1)
语句A;
else if (表达式2)
语句B;
else if (表达式3)
语句C;
else (表达式4) //7行
语句D;
//这样写是错误的,正确的写法:1.去掉7行的(表达式4)
// 2.在else后加if
if (表达式1)
语句A;
else if (表达式2)
语句B;
else if (表达式3)
语句C;
else (表达式4);
语句D;
//这样写语法没错,但逻辑不对
/*
else (表达式4);
语句D;
等价于
else
(表达式4);
D;
*/
2.2 switch
![](https://i-blog.csdnimg.cn/blog_migrate/4330a527afb62b1ef3c991302d5c7f9d.png)
![](https://i-blog.csdnimg.cn/blog_migrate/8ef456676d9315be1e44624ae4db5867.png)
switch(表达式) //表达式类型应为整数类型
{
case 常量 1 :语句 1 //case和常量之间必须有空格
case 常量 2 :语句 2 //常量必须是整型常量表达式
: : :
: : :
case 常量 n :语句 n
default : 语句 n+1
}
//每⼀个 case 语句中的代码执⾏完成后,需要加上 break ,才能跳出这个switch语句
// 在 switch 语句中 case 语句和 default 语句是没有顺序要求的,只要你的顺序是满⾜实际需求的就可以。 不过我们通常是把 default 语句放在最后处理的.
3.循环结构
循环
定义:某些代码会被重复执行
分类: for、while、do while
3.1 for
1)格式
for (表达式1; 表达式2; 表达式3)
语句;
//表达式1用于循环变量的初始化,表达式2用于循环结束条件的判断,表达式3用于循环变量的调整
2)执行的流程【重点】
<1>单个 for 循环的使用
<2>多个 for 循环的嵌套使用
for (表达式1; 表达式2; 表达式3) //1
for (表达式4; 表达式5; 表达式6) //2
语句A; //3
语句B; //4
//整体是两个语句,1 2 3 是第一个语句
//4是第二个语句
for (表达式1; 表达式2; 表达式3)
for (表达式4; 表达式5; 表达式6)
{
语句A;
语句B;
}
//整体是一个语句
for (表达式1; 表达式2; 表达式3)
for (表达式4; 表达式5; 表达式6)
{
语句A;
语句B;
for (表达式7; 表达式8; 表达式9)
C;
}
//整体是一个语句
<3>范围问题
for 默认只控制一条语句,如果想控制多个语句,就要把这些语句用{}括起来。
<4>举例【求1~100的和】
#include <stdio.h>
int main()
{
int i, n = 100, sum = 0;
for (i = 1; i <= 100; i++)
{
sum += i;
}
printf("%d", sum);
return 0;
}
3.2 while
1)格式
while (表达式)
语句;
2)执行流程
3)while 与 for 的比较
for 和 while 可以相互转换。但是 for 的逻辑性更强,更不易出错。
for (表达式1; 表达式2; 表达式3)
语句A;
//等价于
表达式1;
while (表达式2)
{
语句A;
表达式3;
}
3.3 do while
1)格式
do
{
语句;
}while(表达式);
2)执行流程
3.4 break 语句
//例子:
for (i = 0; i < 3; ++i)
{
if (3 > 2)
break; //break虽是if内部的语句,但是它终止的是外部的for循环
printf("hello"); //永远不会输出
}
在多层循环中,break 只能终止最里面包含它的那个循环。
//例子:
for(i = 0; i < 3; i++)
{
for(j = 1; i < 4; j++)
break; //break只能终止离它最近的循环
}
在多层 switch 嵌套中,break 只能终止离它最近的 switch。
//例子:
#include <stdio.h>
int main()
{
int x = 1, y = 0, a = 0, b = 0;
switch (x) //第一个switch
{
case 1:
switch (y) //第二个switch
{
case 0:
a++;
break; //终止第二个switch
case 1:
b++;
break; //终止第二个switch //13,16行二选一执行
}
b = 100;
break; //终止第一个switch
case 2:
a++;
b++;
break; //终止第一个switch //19,23行二选一执行
}
printf("%d %d\n", a, b);
return 0;
}
3.5 continue 语句
//例子:
for (表达式1; 表达式2; 表达式3)
{
语句A;
语句B;
continue;//如果执行该语句,则执行完该语句后,会执行表达式3,C和D都会被跳过去,C和D不会被执行
语句C;
语句D;
}
//例子:
while (表达式)
{
语句A;
语句B;
continue;//如果执行该语句,则执行完该语句后,会执行表达式,C和D都会被跳过去,C和D不会被执行
语句C;
语句D;
}