点击跳转
2.3 switch 语句中的 case 和 default 的顺序问题
6.1 while 循环中的 break 和 continue
6.3 do while 循环中的 break 和 continue
C语句可分为五类:
- 表达式语句
- 函数调用语句
- 控制语句
- 复合语句
- 空语句
今天我们要讲的是控制语句,在学习之前我们先了解一下C语言是一种什么语言?
C语言是结构化的程序设计语言,支持三种结构:
- 顺序结构
- 选择结构(分支)
- 循环结构
控制语句可分为以下三类:
- 分支语句也叫条件判断语句:if 语句,switch 语句;
- 循环执行语句:while 语句,for 语句,do while 语句;
- 转换语句:break 语句,go to 语句,continue 语句,return 语句。
1. if 语句
1.1 if
if 语句的语法形式如下:
if (表达式)
语句
表达式成立(为真),则语句执行,表达式不成立(为假),则语句不执行。
在C语言中,0为假,非0为真。
例子:判断一个数是否为奇数
参考代码:
#include<stdio.h>
int main()
{
int num = 0;
scanf("%d", &num);
if (num % 2 == 1)
printf("%d是奇数\n", num);
return 0;
}
1.2 else
if...else... 语句的语法形式如下:
if(表达式)
语句1;
else
语句2;
例子:输入一个整数,判断是否为奇数,如果是奇数打印奇数,否则打印偶数。
参考代码:
#include<stdio.h>
int main()
{
int num = 0;
scanf("%d", &num);
if (num % 2 == 1)
printf("%d是奇数\n", num);
else
printf("%d是偶数\n", num);
return 0;
}
1.3 分⽀中包含多条语句
在 if 语句中默认都只控制⼀条语句,要想多分支语句要加{ }。(这里的一对{ }就是一个程序块,或者复合语句)
#include<stdio.h>
int main()
{
int age = 10;
if (age < 18)
{
printf("未成年\n");
printf("不能饮酒\n");
}//想要打印两个必须加上{}
else
printf("成年\n");
return 0;
}
1.4 else if (多分支)
else if 语句的语法形式如下:
if(表达式1)
语句1;
else if(表达式2)
语句2;
else
语句3;
例如:输入一个人的年龄,判断他属于哪种人
参考代码:
#include<stdio.h>
int main()
{
int age = 0;
scanf("%d", &age);
if (age < 18)
printf("未成年\n");
else if (age >= 18 && age < 28)
printf("青年\n");
else if (age >= 28 && age < 40)
printf("中年\n");
else if (age >= 40 && age < 100)
printf("老年\n");
else
printf("老寿星\n");
return 0;
}
1.5 悬空else问题
如果有多个 if 和 else ,可以记住这样一条规则,else 总是跟最接近的 if 匹配。
例如:
#include<stdio.h>
int main()
{
int a = 0;
int b = 2;
if (a == 1)
if (b == 2)
printf("hehe\n");
else
printf("haha\n");
return 0;
}
像上面的代码,你可能以为他输出hehe,但实际他什么都不输出。
原因就是:else 总是跟最接近的 if 匹配。
我们把代码改一下就清晰易懂了。
#include<stdio.h>
int main()
{
int a = 0;
int b = 2;
if (a == 1)
{
if (b == 2)
printf("hehe\n");
else
printf("haha\n");
}
return 0;
}
这两个代码其实是一样的,所以大家以后在写代码的时候要注意括号的使用,可让代码的可读性更高。
2. switch 语句
switch 循环语句是一种特殊的 if……else 结构,用于判断条件有多个结果的情况,它把多重 if 改成更易用,可读性更好的形式。
switch (expression)
{
case value1:
statement
case value2:
statement
default:
statement
}
上面代码中,根据 expression 不同的值,,执行相应的 case 分支。如果找不到对应的值就执行 default 分支。
注:
- switch 后面的 expression 必须是整形表达式。
- case 后面的 value 必须是整形常量表达式。
例如:输⼊任意⼀个整数值,计算除3之后的余数
参考代码:
#include<stdio.h>
int main()
{
int n = 0;
scanf("%d", &n);
switch (n % 3)
{
case 0:
printf("整除,余数为0\n");
break;
case 1:
printf("余数是1\n");
break;
case 2:
printf("余数是2\n");
break;
}
return 0;
}
上述代码中,我们要注意的点有:
- case 和后边的数字之间必须有空格
- 每一个 case 语句中的代码执行完成后,需要加上 break,才能跳出这个 switch 语句。、
2.1 break
- 在 switch 语句中,我们没办法直接实现分支,搭配 break 使用才能实现真正的分支。
- switch 的每个 case 之后如果没有加 break 语句,当前 case 执行结束后会继续执行紧跟 case 中的语句。
例如:输入一个1~7的数字,打印对应的星期几
参考代码:
#include<stdio.h>
int main()
{
int day = 0;
scanf("%d", &day);
switch (day)
{
case 1:
printf("星期一\n");
break;
case 2:
printf("星期二\n");
break;
case 3:
printf("星期三\n");
break;
case 4:
printf("星期四\n");
break;
case 5:
printf("星期五\n");
break;
case 6:
printf("星期六\n");
break;
case 7:
printf("星期日\n");
break;
}
return 0;
}
当然如果逻辑需要,case 后面可以不加 break 。
例如:
#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;
}
2.2 default
default 是用于 switch 之中与 case 连用,若没有与 case 匹配的就会跳到default。
例如:前面的打印星期的例子,如果 day 输入的不是1~7的值,我们就要使用 default 了。
#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");
break;//防止输入8时没有输出
}
return 0;
}
2.3 switch 语句中的 case 和 default 的顺序问题
其实在 switch 语句中 case 语句和 default 语句是没有顺序要求的,满足实际需求就可以。
不过我们通常是把 default 放在最后面处理的。
3. while循环
while 语句的语法结构和 if 语句非常相似。
while(表达式)
循环语句;
例如:
#include<stdio.h>
int main()
{
while (1)
printf("hehe\n");
//while后边的条件满足,死循环的打印hehe
return 0;
}
3.1 while 循环的实践
例如:在屏幕上打印1~10的值
#include<stdio.h>
int main()
{
int i = 1;
while (i <= 10)
{
printf("%d ", i);
i = i + 1;
}
return 0;
}
3.2 练习
输入一个正的整数,逆序打印这个整数的每一位
例如: 输入:1234,输出:4321
输入:521,输出:125
思路:
- 想要得到 n 的最低位,可以用 n%10 的运算,得到的余数就是最低位,eg:1234%10得到4
- 想要去掉 n 的最低位,找到倒数第二位,要使用 n=n/10 就可以去掉最低位的,eg:n=1234/10得到123,然后在%10就得到倒数第二位3.
- 循环1和2两个步骤,在n变成0之前,就可以实现倒叙了。
参考代码:
#include<stdio.h>
int main()
{
int n = 0;
scanf("%d", &n);
while (n)
{
printf("%d ", n % 10);
n /= 10;
}
return 0;
}
4. for循环
for 循环是三种循环中使用最多的,for 循环的语句形式如下:
for(表达式1;表达式2;表达式3)
循环语句;
- 表达式1:初始化部分,用于初始化循环的变量(循环过程中初始化部分只被执行 1 次)
- 表达式2:条件判断部分,用于判断循环什么时候停止
- 表达式3:调整部分,用于循环条件的调整
4.1 练习
练习:在屏幕上打印1~10的值
参考代码:
#include<stdio.h>
int main()
{
int i = 0;
// 初始化 判断 调整
for (i = 1; i <= 10; i++)
{
printf("%d ", i);
}
return 0;
}
练习:计算1~100之间3的倍数的数字之和
参考代码:
#include<stdio.h>
int main()
{
int i = 0;
int sum = 0;
for (i = 1; i <= 100; i++)
{
if (i % 3 == 0)
sum += i;
}
printf("%d\n", sum);
return 0;
}
也可以优化一下:
#include<stdio.h>
int main()
{
int i = 0;
int sum = 0;
for (i = 3; i <= 100; i += 3)
{
sum += i;
}
printf("%d\n", sum);
return 0;
}
4.2 注意事项
- for 循环的三个表达式都可以省略掉(初始化,判断,调整),但是否要省略得看逻辑,要不可能变成死循环。
- 不可在 for 循环体内修改循环变量,防止 for 循环失去控制。
- 建议 for 语句的循环控制变量的取值采用"前闭后开区间"写法(不是必须)。
- for 循环的判断部分省略意味这判断会恒成立。
- 多个变量控制循环没问题。
5. do while 循环
在循环语句中 do while 语句的使用最少,语法如下:
do
循环语句;
while(表达式);
do while 语句中循环体是至少执行一次的,这是 do while 循环比较特殊的事情。
例如:在屏幕上打印1~10的值
#include<stdio.h>
int main()
{
int i = 1;
do
{
printf("%d ", i);
i = i + 1;
} while (i <= 10);
return 0;
}
5.1 练习
练习:输入一个正整数,计算这个整数是几位数?
例如: 输⼊:1234 输出:4
输⼊:12 输出:2
参考代码:
#include<stdio.h>
int main()
{
int n = 0;
scanf("%d", &n);
int cnt = 0;
do
{
cnt++;
n = n / 10;
} while (n);
printf("%d\n", cnt);
return 0;
}
这里并非必须使用 do while 语句,,但是这个代码就比较适合使用 do while 循环,因为 n 即使是0,也是1位数,要统计位数的。
6. break和continue语句
在循环执行过程中,如果某些状况发生的时候,需要提前终止循环,,这是非常常见的现象。
C语言中提供了 break 和 continue 两个关键字,就是应用到循环中的。
6.1 while 循环中的 break 和 continue
while 里的 break 是终止整个 while 循环
例如:
#include<stdio.h>
int main()
{
int i = 1;
while (i <= 10)
{
if (i == 5)
break;//当i等于5后,就执行break,循环就终止了
printf("%d ", i);
i = i + 1;
}
return 0;
}
continue 是继续的意思,在循环中的作用就是跳过本次循环中 continue 后边的代码,继续进行下一次循环的判断。
例如:
#include<stdio.h>
int main()
{
int i = 1;
while (i <= 10)
{
if (i == 5)
continue;
//当i等于5后,就执行continue,直接跳过continue的代码,去循环的判断的地方
//因为这里跳过了i=i+1,所以i一直为5,程序陷入死循环
printf("%d ", i);
i = i + 1;
}
return 0;
}
6.2 for 循环中的 break 和 continue
其实和 while 循环中的 break 一样,for 循环中的 break 也是用于终止循环的,不管循环还需要多少次,只要执行到了 break,,循环就彻底终止。
例如:
#include<stdio.h>
int main()
{
int i = 1;
for (i = 1; i <= 10; i++)
{
if (i == 5)
break;
printf("%d ", i);
}
return 0;
}
在 for 循环中 continue 的作用是跳过本次循环中 continue 后的代码,直接去到循环的调整部分。
例如:
#include<stdio.h>
int main()
{
int i = 1;
for (i = 1; i <= 10; i++)
{
if (i == 5)
continue;//这里continue跳过了后边的打印,,来到了i++的调整部分
printf("%d ", i);
}
return 0;
}
6.3 do while 循环中的 break 和 continue
do while 循环中的 break 和 continue 的作用和 while 循环中几乎一模一样。
7. 循环的嵌套
前面学习了三种循环 while ,do while ,for ,这三种循环往往会嵌套在一起才可以更好的解决问题。
练习:找出100~200之间的素数,并打印在屏幕上。
注:素数又称质数,只能被1和本身整除的数字。
题目解析:
- 要从100~200之间找出素数,首先得有100~200之间的数,这里可以使用循环解决。
- 假设要判断i是否为素数,需要拿2~i-1之间的数字去试除i,需要产生2~i-1之间的数字,也可以使用循环解决。
- 如果2~i-1之间有数字能整除i,则i不是素数,如果都不能整除,则i是素数。、
参考代码:
#include<stdio.h>
int main()
{
int i = 0;
//循环产⽣100~200的数字
for (i = 100; i <= 200; i++)
{
//判断i是否为素数
//循环产⽣2~i - 1之间的数字
int j = 0;
int flag = 1;//假设i是素数
for (j = 2; j < i; j++)
{
if (i % j == 0)
{
flag = 0;
break;
}
}
if (flag == 1)
printf("%d ", i);
}
return 0;
}
8. goto语句
goto 语句可以实现在同一个函数内跳转到设置好的标号处。
例如:
int main()
{
printf("hehe\n");
goto next;
printf("haha\n");
next:
printf("跳过了haha的打印\n");
return 0;
}
goto循环在平常是不常用的,主要是在多次循环中跳出使用。