《C语言》-(流程控制:顺序结构、选择结构、循环结构)
一、顺序结构
-
默认的流程结构,按照书写的顺序执行;
二、选择结构
-
概念:对给定的条件进行判断,根据判断结果来决定执行那一段代码;
1. if语句
-
if语句的基本使用
/*
1.if的第一种结构
if(条件)
{
语句1;
语句2;
......
}
2.if的第2种结构
if(条件1)
{
语句1;
语句2;
......
}
else
{
语句3;
语句4;
.......
}
3.if的第3种结构(按顺序判断条件,遇到某个条件成立就执行其代码(也说明该条件前的所有条件都不成立),执行完不再对条件进行判断)
if(条件1)
{
语句1;
语句2;
.......
}
else if(条件2)
{
语句3;
语句4;
.......
}
else if(条件3)
{
语句5;
语句6;
.......
}
else
{ // 前面条件都不成立就来到这里
语句7;
语句8;
.......
}
4.if的第4种结构
if(条件)
语句1; // 条件成立就执行语句1
语句2; // 语句2与if语句没有关系,必然执行
.......
*/
#include <stdio.h>
int main()
{
/*
// 练习1
int count = 40;
if (count > 50)
{
printf("开班!!!\n");
printf("准备机器!!!\n");
}
else
{
printf("不开班!!!\n");
printf("不准备机器!!!\n");
}*/
/*
// 练习2
int a = 5;
if (a==10)
{
printf("a=10\n");
}
else if(a==5)
{
printf("a=5\n");
}
else if(a==3)
{
printf("a==3\n");
}
else
{
printf("a=其他值\n");
}*/
/*
//练习3
int a = 10;
if (a++ > 10) // 先将a=10 与 10 比较判断(假),再加1 即 a=11
{
printf("A\n");
}
else if(a++ > 5) // 此时a=11,先将a=11 与 5 比较判断(真,下面的条件就不再进行运行、判断,) 再让a加1 即a=12
{
printf("B\n");
}
else if(a++ > 3) // 由于条件2成立了,一下代码不再进行运行、判断,a不会再进行加1操作
{
printf("C\n");
}
else
{
printf("D\n");
}
printf("a的值是%d\n", a); // 运行结果为:B a的值是12
*/
// 练习4
int a = 10;
if(a > 11) // 条件没有成立,不会执行哈哈哈哈,但还是会执行嘿嘿嘿嘿
printf("哈哈哈哈\n");
printf("嘿嘿嘿黑\n"); // 此语句与if语句没有关系,必然会执行
// 运行结果为: 嘿嘿嘿嘿
return 0;
}
-
if语句的陷阱
陷阱一:比较大小时,常量放在左边,变量放在右边
int a = 10431;
if (a == 0) // 如果少写了一个 = ,即:a = 0; 相当于赋值操作,而且不会报错,没有提醒!!!
{
语句1;
}
else
{
语句2;
}
/* 总结:
比较大小时,常量放在左边,变量放在右边
即:if (0 == a) 如果少写一个 = ,即:0 = a; 此时由于常量不能被赋值,会报错提醒!!!
*/
陷阱二:注意赋值运算符 = 不要写成了 ==
int a = 10;
a = 15; // 如果多写了一个 = ,即:a == 15; 此时有一个警告,并不会报错,但是并没有对a再次赋值为15,a还是等于10;
printf("%d", a);
/*
总结:注意赋值运算符 = 不要写成了 == ,后果很严重!
*/
陷阱三:if后面不要随便写分号
if (5 > 6); // 多写了一个分号; 导致大括号里面的代码成了一个代码块,必然会执行 { printf("A"); } // 总结:if后面不要随便写分号 ;
陷阱四:作用域问题
if (10 > 6);
{
int a = 5; // 变量a的作用域为if后面的大括号内
} // 变量a再内存中被销毁了
printf("%d", a);
// 解释:作用域问题:a只在大括号内有效,执行到printf函数时,变量a已经被回收,就会报错:(error: use of undeclared identifier 'a'),使用了未定义的标识符;
陷阱五:作用域不明确
#include <stdio.h>
int main()
{
if (10 > 6)
int a = 5;
}
// 解释:从整个代码来看,变量a是属于main函数,但是对于if语句来讲,变量a的作用域只在if语句内有效,会造成变量a的作用域不明确问题;
// 报错信息:error: expected expression
// 总结:如果要在if语句后面的代码中定义新的变量,必须用大括号扩住
-
if语句代码练习:
/*
输入一个整数score代表分数,根据分数输出等级(A-E)(用两种方式)
A:90~100
B:80~89
C:70~79
D:60~69
E:0~60
*/
#include <stdio.h>
int main()
{
/* 方式1:性能差 每个if语句都要进行判断
// 1.提示用户输入一个分数
printf("请输入一个分数:\n");
// 2.接受用户输入的分数
int score = 0;
scanf("%d", &score);
// 3.判断等级
if(score >= 90 && score <= 100){ //不能写成 if(90 <= score <= 100),这种写法是从左向右执行,即先运算 90 <= score ,再运算 score <= 100;
printf("A\n");
}
if(score >= 80 && score <= 89){
printf("B\n");
}
if(score >= 70 && score <= 79){
printf("C\n");
}
if(score >= 60 && score <= 69){
printf("D\n");
}
if(score <= 59){
printf("E\n");
}
*/
/* 方式2:性能中等
// 1.提示用户输入一个分数
printf("请输入一个分数:\n");
// 2.接受用户输入的分数
int score = 0;
scanf("%d", &score);
// 3.判断等级
if(score >= 90 && score <= 100){ //不能写成 if(90 <= score <= 100),这种写法是从左向右执行,即先运算 90 <= score ,再运算 score <= 100;
printf("A\n");
} else if(score >= 80 && score <= 89){
printf("B\n");
} else if(score >= 70 && score <= 79){
printf("C\n");
} else if(score >= 60 && score <= 69){
printf("D\n");
} else { // 此句代码也可以省略条件,因为代码能来到这里说明前面的条件都不成立
printf("E\n");
}
*/
// 方式3:性能最优
// 1.提示用户输入一个分数
printf("请输入一个分数:\n");
// 2.接受用户输入的分数
int score = 0;
scanf("%d", &score);
// 3.判断等级
if(score >= 90 && score <= 100){ //不能写成 if(90 <= score <= 100),这种写法是从左向右执行,即先运算 90 <= score ,再运算 score <= 100;
printf("A\n");
} else if(score >= 80){ // 代码能来到这里说明前面的条件不成立,即score < 90
printf("B\n");
} else if(score >= 70){
printf("C\n");
} else if(score >= 60){
printf("D\n");
} else { // 此句代码也可以省略条件,因为代码能来到这里说明前面的条件都不成立
printf("E\n");
}
return 0;
}
2.switch语句
-
格式:
switch (数值/变量)
{
case 数值1:
语句1;
break;
case 数值2:
语句2;
break;
... ...
default:
语句8;
break;
}
注意:1.break是推出整个switch语句的标志
2.如果case后面没有写break;就会执行后面的所有case中的语句,不再判断,知道遇到break为止,但是有时候故意不掉了break。
-
switch语句的注意点:
#include <stdio.h>
int main()
{
char a = '+';
int b = 10;
int c = 15;
// 注意点1:如果要再case后面定义新的变量,必须用大括号扩住
/*
// 错误写法:变量sum和minus作用域不明确,看着是switch后面的大括号,其实是case后面的大括号,此时要在case后面加大括号扩住
switch (a) {
case '+':
int sum = b + c;
printf("和是%d\n", sum);
break;
case '-':
int minus = b - c;
printf("差是%d\n", minus);
break;
}*/
switch (a) {
case '+':
{
int sum = b + c;
printf("和是%d\n", sum);
break;
}
case '-':
{
int minus = b - c;
printf("差是%d\n", minus);
break;
}
}
return 0;
}
三、循环结构
1.while语句
-
格式:
while (条件)
{
语句...;
...
}
注:1.如果一开始条件就不成立,就永远不会执行循环体;
2.条件成立就执行,执行完就再次判断,如果还成立就再次执行;
3.大括号内的内容较循环体;
-
continue:直接结束本次循环,进入下次循环
例:
while (count < 50)
{
count ++;
if (count % 10 == 0)
{
continue;
}
printf("%d", count);
}
解释:count % 10 == 0时,即count为10的整数倍时,就会执行continue(结束本次循环,不再输入,而直接进入下次循环)
-
break:结束整个while循环
例:
while (count < 50)
{
count ++;
printf("%d", count);
if (count == 20)
{
break;
}
}
解释:当count == 20时,直接结束整个while循环
-
while代码练习一:
运行结果:
-
while语句练习二
运行结果:
-
while语句总结:
1.运行原理:
-
- 如果一开始条件就不成立,永远不会执行循环体
- 如果条件成立,就会执行一次循环体,执行完毕后,再次判断条件是否成立........
2.continue:
-
- 结束本次循环直接进入下次循环;
3.break:
-
- 直接结束整个while循环。
2.do while循环语句
-
格式:
do
{
循环体;
} while (条件);
-
while和do while的区别:
1.while语句和do while语句有时候可以互换
2.while语句在执行时,第一次就会判断条件是否成立;
do while语句在执行时,第一次不管条件是否成立,都会执行(至少执行一次);
3.for循环语句
-
格式:
for (语句1; 条件; 语句2)
{
循环体;
}
说明:语句1:初始化语句;
语句2:增量语句;(执行完循环体后,再执行的语句)
-
运行原理:
1.for循环一开始就会执行一次语句1,并且整个for循环只会执行一次;
2.判断条件是否成立,如果成立,就会执行循环体,然后就会执行语句2,再次判断条件是否成立..........
-
for循环使用注意:
注意点一:不要随便在for()后面写分号;
for (int i = 10; i < 5; i++);
{
printf("哈哈"); // 加上分号后,大括号里面的内容就成了一个独立的代码块,与for循环没有关系;
}
注意点二:作用域不明确(错误)
for (int i = 0; i < 5; i ++)
int a = 10;
注意点三:作用域错误
for (int i = 0; i <5; i++)
{
int a = 20;
}
printf("%d", a);
注意点四:
int a = 10;
for (int i = 0, a = 9; i < 5; i++)
{
int i = 10; // 这里不会报错,两个变量i的作用域是不一样的
int a = 11;
printf("a = %d", a); // 首先在{}内找,没有找到就会去for()循环内找,还没有找到就会去for循环外招
}
注意点五:最简单的利用for循环实现的死循环
for( ; ;); // 条件默认为真!
四、break和continue的区别
1.break:
-
使用场合:
- switch语句:退出整个switch循环;
- 循环语句:退出整个循环 (while循环、do while循环、for循环)
-
注意点:
在嵌套循环中,只对最近的循环结构有效。
2.continue:
-
使用场合:
循环结构:结束当前这次循环,直接进入下一次循环 (while循环、do while循环、for循环)
-
注意点:
在嵌套循环中,只对最近的循环结构有效。