人生若只如初见,人的一生中有着很多选择与循环,C语言也一样
文章目录
前言
这一篇笔记是去理解如何正确的使用C语言中分支语句和循环语句。
分支语句:
- if
- switch
循环语句:
- while
- for
- do while
goto语句:
一、分支语句
1.if 语句
if语句的语法结构:
语法结构:
if(表达式) 语句;
if(表达式) 语句1;
else 语句2;
------多分支------
if(表达式1)
语句1;
else if(表达式2)
语句2; else
语句3;
这里说明一下什么是语句:
C语言中由一个分号;
隔开的就是一条语句。
if语句代码
#include <stdio.h>
//代码1
int main() {
int a = 0;
scanf("%d", &age);
if(a < 18){
//输入的数字a,小于18则打印未成年
printf("未成年\n");
}
return 0;
}
#include <stdio.h>
//代码2
int main() {
int a = 0;
scanf("%d", &age);
if(a < 18){
//输入的数字a,小于18则打印未成年
printf("未成年\n");
}
else{
//否则打印成年
printf("成年\n");
}
return 0;
}
#include <stdio.h>
//代码3
int main() {
int a = 0;
scanf("%d", &age);
if(a < 18){
//输入的数字a,小于18则打印未成年
printf("未成年\n");
}
else if(a >= 18 && a < 30){
//又或者,输入的数字大于等于18并且小于30,打印成年
printf("成年\n");
}
else{
//否则打印白骨精
printf("白骨精\n");
}
return 0;
}
注意:我们之前说过,C语言中非0为真,0为假
而在if语句里,如果表达式的结果为真,则语句执行。
#include <stdio.h>
int main(void){
if(3){
printf("我是真的\n");
//这里表达式是真,所以打印:我是真的。
}
else{
printf("我是假的\n");
//假如表达式里面为假(0),则会打印:我是假的。
}
return 0;
}
接下来我们看看这种比较特殊的情况
悬空else
#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;
//这里因为a = 0没有符合判断条件,所以程序根本没有走进去,没有打印结果
}
注:else
是和离得最近的if匹配
如果想要if或者else控制多个语句的时候,要带{}
,在这里,一对{}
就是一个代码块。如果不带{}
默认只能控制一条语句。
小练习:尝试使用if
语句来输出1~100之间的奇数(这里会超纲一点用到for
)
输出1~100之间的奇数
#include<stdio.h>
int main(){
int i = 1;
for(i = 1; i <= 100; i++){
if(i % 2 == 1)
printf("奇数:%d ", i);
}
return 0;
}
2.switch语句
switch
语句也是一种分支语句,常常用作多分支的情况
switch语句的写法
switch(整型表达式){
语句项;
}
注意:swich()
跟着的必须是整型常量表达式
这里的语句项指的是一些case语句
case 整型常量表达式;
语句;
注意:case
后面跟着的必须是整型常量表达式
在switch
语句中,我们没法直接实现分支,所以需要搭配break使用才能实现分支
switch语句中的break
int main(){
int a = 0;
scanf("%d ", &a);
switch(a)
{
case 1: printf("星期一\n");
case 2: printf("星期二\n");
case 3: printf("星期三\n");
case 4: printf("星期四\n");
case 5: printf("星期五\n"); break;
case 6: printf("星期六\n"); break;
case 7: printf("星期天\n"); break;
}
//在这段代码中,我们输入几就从case 几进去开始一直执行下去,直到碰到break
return 0;
}
由此我们可知,case
语句的特点:没人阻止它,就会一直执行下去。
而break
语句的特点:跳出,停止。直接跳出这个switch
语句。
这时候可能你会想如果上述代码中,我输入的数字都没有匹配case
子句该怎么办呢,这时候我们就需要用到default
子句来防止这种现象。
需要注意的是:default
子句放在代码块哪里都可以,但我们一般把它放在最后以便阅读。
default子句
//还是上面的代码
int main(){
int a = 0;
scanf("%d ", &a);
switch(a)
{
case 1: printf("星期一\n");
case 2: printf("星期二\n");
case 3: printf("星期三\n");
case 4: printf("星期四\n");
case 5: printf("星期五\n"); break;
case 6: printf("星期六\n"); break;
case 7: printf("星期天\n"); break;
default:printf("输入错误\n");break;
}
//在这段代码中,我们输入8时,所有case都不匹配,打印输入错误
return 0;
}
所以我们编程时应该养成一个好习惯,在每个switch语句中都放一条default
子句,甚至可以在后面再加一个break
。
同时,switch
语句也允许嵌套使用。
有了以上的铺垫,我们来看一段代码练习
代码练习
int main(){
int n = 1;
int m = 2;
switch(n){//n为1,从case1开始执行代码
case 1:m++;//m+1=3,此时m为3
case 2:n++;//n+1=2,此时n为2
case 3:
switch(n){//因为此时的n为2,跳过case1,从case2开始执行代码
case 1:n++;
case 2:m++;n++;break;//执行完这行后,m=4,n=3,碰到break,跳出这个switch
}
case 4:m++;break;//此时m=4,m++后m=5,碰到break跳出整个switch
default:break;
}
printf("m = %d, n = %d\n", m, n);
//最终打印结果为m = 5, n = 3
return 0;
}
二、循环语句
1.while 语句
我们已经掌握了if
语句,但这个语句中只会执行一次。可在生活中,我们同一件事往往都需要重复完成很多次。例如:上学,上班,照顾孩子,照顾老婆,睡觉,起床等等…
那在C语言中需要这么做呢?这时候,我们就需要用到while
语句实现循环。
while 语法结构
while(表达式){
语句;
那么我们如何理解while
语句呢?
举个例子:有一天你不小心惹老婆生气了,老婆让你跪榴莲,你跪啊跪,如此往复循环跪了7749天的时候,你老婆终于才消气原谅你。这就是while
语句。
其中:表达式(判断=老婆生气到她消气为止)
语句(不断跪榴莲,跪了7749天)
结果 (终于不用跪榴莲了,因为老婆消气了)
这时候我们用代码来实现一下
while语句实现跪榴莲
#include<stdio.h>
int main() {
int day = 1;
while(day<49)//老婆生气了!没跪够49天都没法消气。
//判断跪的天数是否够49天,不够就一直循环
{
printf("跪榴莲的第%d天 ", day);
day = day+1; //跪一天记录一次
}
printf("第%d天老婆终于消气了 \n", day);//终于在第49天老婆消气了
return 0;
}
上面代码已经帮我们了解了while
语句的基本语法,那我们再来了解一下在while
语句中,break
和continue
先来介绍break
,break
是个和事佬,还是上面的例子,你惹老婆生气后,正在跪榴莲,这时你的女儿替你求情让你别再跪榴莲了,你老婆心软了,你后面就再也不用跪榴莲了。
我们用代码来实现一下场景
"女儿"break求情
#include<stdio.h>
int main() {
int day = 1;
while(day<49)//老婆生气了!没跪够49天都没法消气。
//判断跪的天数是否够49天,不够就一直循环
{
printf("跪榴莲的第%d天 ", day);
day = day+1; //跪一天记录一次
if(day == 5){
//这里的第五天,你的女儿替你求情了,此时跳出这个循环
printf("你的女儿替你求情了!");
break;
}
}
printf("第%d天老婆终于消气了 \n", day);//终于在第49天老婆消气了
return 0;
}
好了,看完以上代码我们来总结一下break
在while
中的作用
其实在循环中只要遇到break,就停止后期的所有的循环,直接终止循环。
所以:while中的break是用于永久终止循环的。
接下来我们要介绍一下continue
了,又是上面的例子,如果说break
是女儿的话,那continue
就是儿子,儿子来求情作用那可就没女儿大了,假设你老婆生气后让你每天跪完榴莲还要跪键盘,现在你的儿子来为你求情,可是你老婆并没有心软,她只是让你今天跳过了跪键盘这个步骤,隔天还是继续。
这里我们还是用代码来实现一下场景
"儿子"continue求情
#include<stdio.h>
int main() {
int day = 1;
int keyboard = 1;
while(day<49)//老婆生气了!没跪够49天都没法消气。
//判断跪的天数是否够49天,不够就一直循环
{
printf("跪榴莲的第%d天 \n", day);
day = day+1;
if(day == 5){
//这里的第五天,你的儿子替你求情了,但也只是今天不用跪键盘
printf("你的儿子替你求情了,你今天不用跪键盘\n");
continue;
}
printf("第%d次跪键盘\n", keyboard);
keyboard = keyboard+1;
}
printf("第%d天老婆终于消气了 \n", day);//终于在第49天老婆消气了
return 0;
}
综上我们可知:在while
循环中,continue
的作用是跳过本次循环continue
后边的代码,并且直接去判断部分,看是否进行下一次的循环。
在这里我们在补充一个小知识:
getchat();
--从键盘获取一个字符
putchat();
--输出一个字符
EOF
– end of file – 文件结束标志
我们利用while
来实现一下他们的功能
#include<stdio.h>
int main() {
int ch = 0;
//ctrl + z - getchar就读取结束,等于碰到了EOF。
while((ch = getchat()) != EOF){
putchar(ch);
}
//此时我们从键盘输入什么,就会打印什么,知道判断你按了ctrl + z
return 0;
}
ok,知道了getchar
的作用,我们再来写一段确认密码的代码
#include<stdio.h>
int main() {
char password[20] = { 0 };
printf("请输入密码:");
scanf("%d", password);//数组的数组名本身就是地址,所以不需要取地址&
//输入的时候其实是123456\n,带了个\n
printf("请确认密码(Y/N):");
//清理缓冲区
//getchar();//处理'\n'
//清理缓冲区的多个字符
int tmp = 0;
while((tmp = getchar()) != '\n');
int ch = getchar();
if(ch == 'Y'){
printf("确认成功\n");
}
else{
printf("确认失败\n");
}
return 0;
}
总结一下:
1、getchar
,scanf
这种叫输入函数,通过缓冲区来获取键盘输入的东西。
2、当有多个字符的时候getchar
就会无法处理,此时就需要while
循环来取掉缓冲区的\n
或者多余的字符。
3、数组的数组名本身是个地址,所以不需要取地址&
。
最后对于while进行总结:
对于while
循环语句,我们需要注意到三个重要的点:
1、初始化
2、判断部分
3、调整部分
2.for 循环语句
既然我们已经知道了while
循环,但是为什么我们还要一个for
循环呢?
首先来看看for
循环的语法:
for(表达式1; 表达式2; 表达式3)
循环语句;
其中:
表达式1:为初始化部分,用于初始化循环变量的。
表达式2:为条件判断部分,用于判断循环时候终止。
表达式3:为调整部分,用于循环条件的调整。
这里我们先来对比一下for
循环和while
循环的代码。
for和while的大比拼
#include<stdio.h>
int main() {
int i = 0;
//实现相同的功能,使用while
i = 1;//while的初始化部分
while(i <= 10){//判断部分
printf("hehe\n");
i = i + 1;//调整部分
}
//实现相同的功能,使用for
for(i = 1; i <= 10; i++){
printf("hehe\n");
}
return 0;
}
从以上代码中,我们不难发现,
while
循环中依然存在循环的三个必要条件,但随着代码的增加,很可能会使得三个必要条件逐渐偏离较远,查找和修改不够集中和方便,所以,for
循环的风格利于我们的查找和修改;因此for
循环使用的频率也是最高的。
在for
循环中,break
的作用也是用来终止循环的。
for循环中的break
#include<stdio.h>
int main() {
int i = 0;
for(i = 1; i <= 10; i++){
if(i == 5)
break;
printf("%d ", i);
//打印结果为1234
}
}
return 0;
}
for
循环中,continue
是跳到调整部分的。
for循环中的continue
#include<stdio.h>
int main() {
int i = 0;
for(i = 1; i <= 10; i++){
if(i == 5)
continue;
//打印结果为1 2 3 4 6 7 8 9 10
printf("%d ", i);
//打印结果为1234
}
}
return 0;
}
除此之外,我们要防止在循环体内去改变变量,这样做会导致循环体进入死循环。
for
里面的初始化部分,判断部分,调整部分,都可以省略。但判断部分的省略会恒为真。
for循环的恒为真
#include<stdio.h>
int main() {
for(; ; ){
printf("我可是恒为真\n");
}
return 0;
}
当然,我们的for
循环也可以内套for
循环
for循环的套娃
#include<stdio.h>
int main() {
int i = 0;
int j = 0;
for(i = 0; i < 3, i++){
for(j = 0; j < 3; j++){
printf("hahaha\n");
//这里会打印9个hahaha
}
}
return 0;
}
上述代码运行的步骤:
1、进入第一层for循环,此时i = 0。
2、i++后i=1,再进入第二层的for循环。
3、进入第二层for循环三次打印三次hahaha后,此时的j=4,不符合判断条件,并跳回去第一层for循环。
4、此时第一层for循环的i=1,并再次进行步骤2和3(此时的i为1,i++后为2)。
5、如此反复三次后,打印出来为9个hahaha。
有了以上的了解后,那如果我们把for
循环里面的初始值省略掉会如何呢?
#include<stdio.h>
int main() {
int i = 0;
int j = 0;
for( ; i < 3, i++){
for( ; j < 3; j++){
printf("hahaha\n");
//这里会打印3个hahaha
}
}
return 0;
}
上述代码运行的步骤:
1、当i = 0的时候,进入内层的for循环
2、内层的for循环打印3个hehe后,j = 3
3、j = 3的时候,返回到外层for循环
4、此时返回到外层for循环的j = 3
5、j = 3的时候条件不成立进不去内层for循环
6、外层for循环重复三次后,停止了循环
所以,我们在写for循环的时候,也不要随意省略初始值
2.循环语句 do while
do
语句的语法:
do
循环语句;
while(表达式);
do while
语句的特点:循环至少执行一次,使用场景有限,并不是经常使用。
#include <stdio.h>
int main() {
int i = 1;
do{
printf("%d ", i);
i++;
}while(i<=10);
//打印结果为1 2 3 4 5 6 7 8 9 10
return 0;
}
do while
语句中因为continue
使用不当导致死循环的情况
#include <stdio.h>
int main() {
int i = 1;
do{
if (i == 5);
continue;
printf("%d ", i);
i++;
}while(i<=10);
//打印结果为1 2 3 4 死循环。
return 0;
}
因为do while
语句的特点:循环至少执行一次,所以在continue
跳过后面的判断部分后,do
依旧执行了代码,并一直卡在了if
处导致了死循环。
总结
分支语句和循环语句在C语言中出现的频率很高,所以需要更多的了解并掌握如何运用,下一篇笔记将会做一些练习以加强理解。