目录
3.5 switch语句中的case和default的顺序问题
7.3 do while循环中的break和continue
1. 引言:你是否了解C语言?
前面的文章中提到了if---else语句,其属于分支和循环的知识,为了更好的理解分支和循环,下面逐一介绍这几个语句。
2. if语句
2.1 语法形式
if ( 表达式 )//表达式成⽴(为真),则语句执⾏,表达式不成⽴(为假),则语句不执⾏。
{
语句
}
注意:C语言中,0为假,非0为真。
即表达式的结果如果是0,则语句不执⾏,表达式的结果如果不是0,则语句执⾏。
2.2 执行流程
2.3 代码示例
//输⼊⼀个整数,判断是否为奇数
#include<stdio.h>
int main()
{
int num = 0;
printf("请输入一个整数:");
scanf("%d", &num);
if (num % 2 == 1)
//表达式成⽴(为真),即num为奇数,语句执⾏。
//表达式不成⽴(为假),即num为偶数,语句不执⾏。
{
printf("%d 是奇数\n", num);//语句
}
return 0;
}
一个数如果不是奇数,那么就是偶数,如果任意⼀个整数,我们要清楚的判断是奇数还是偶数该怎么表示呢?
2.4 if...else...语句
2.4.1 语法形式
if(表达式)//表达式成⽴(为真),则语句1执⾏。
{
语句1
}
else//表达式不成⽴(为假),则语句2执⾏。
{
语句2
}
2.4.2 执行流程
即在if语句流程上变化,表达式为0时,执行else下的语句,然后结束。
2.4.3 代码示例
#include<stdio.h>
int main()
{
int num = 0;
printf("请输入一个整数:");
scanf("%d", &num);
if (num % 2 == 1)
{
printf("%d 是奇数\n", num);
}
else
{
printf("%d 是偶数\n", num);
}
return 0;
}
2.5 分支中包含多条语句
注意:默认在 if 和 else 语句中,它们都只控制⼀条语句。
代码示例
#include <stdio.h>
int main()
{
int age = 0;
printf("请输入年龄:");
while (scanf("%d", &age) == 1)
{
if (age >= 18)
printf("成年了\n");
printf("可以谈恋爱了\n");
}
return 0;
}
上面代码运行结果为:
上面的运行结果:无论年龄是否大于等于18岁,“可以谈恋爱了”都会数输出,但小于18岁只会输出“可以谈恋爱了”,而不会输出“成年了”。
由此可以看出:printf("成年了\n")语句是受if语句控制的,而printf("可以谈恋爱了\n")语句不受if语句控制。即if语句只控制一条语句。
下面加上else:
#include <stdio.h>
int main()
{
int age = 0;
printf("请输入年龄:");
while (scanf("%d", &age) == 1)
{
if (age >= 18)
printf("成年了\n");
else
printf("未成年\n");
printf("不可以谈恋爱\n");
}
return 0;
}
上面代码运行结果为:
天理难容啊,未成年不可以谈恋爱也就算了,成年了竟然也也不可以。
由此可见,else语句也只能控制一条语句。
那么如何让它们控制多条语句呢?使用{}就可以实现了。
#include <stdio.h>
int main()
{
int age = 0;
printf("请输入年龄:");
while (scanf("%d", &age) == 1)
{
if (age >= 18)
{
printf("成年了\n");
printf("可以谈恋爱了\n");
}
else
{
printf("未成年\n");
printf("不可以谈恋爱\n");
}
}
return 0;
}
运行结果为:
这样就完美了。
2.6 嵌套if
//一个整数要么是0,要么是正数,要么是负数。
#include <stdio.h>
int main()
{
int num = 0;
scanf("%d", &num);
if(num == 0)
printf("输⼊的数字是0\n");
else if(num > 0) //这⾥的if 相当于嵌套在els语句中,形成了嵌套结构
printf("输⼊的数字是正数\n");
else
printf("输⼊的数字是负数\n");
return 0;
}
与前面的代码结合一下
//先判断是否为正数,如果是,再判断是奇数还是偶数,并输出;如果不是,则输出非正数。
#include <stdio.h>
int main()
{
int num = 0;
printf("请输入一个整数:");
scanf("%d", &num);
if (num > 0)//正数
{
if (num % 2 == 0)
printf("偶数\n");
else
printf("奇数\n");
}
else//非正数
{
printf("⾮正数\n");
}
return 0;
}
2.7 悬空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;
}
运行结果为:啥都不输出。
为什么呢?
#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;
}
另外若想else与第一个if匹配,修改一下代码就可以实现。
#include <stdio.h>
int main()
{
int a = 0;
int b = 2;
if (a == 1)//a!=1,故表达式a==1为假,不执行下{}里的语句。
{
if (b == 2)
printf("hehe\n");
}
else//语句执行,输出haha。
{
printf("haha\n");
}
return 0;
}
而且代码更具有逻辑性,更加清晰,这是{}的功劳。只要带上适当的⼤括号,代码的逻辑就会更加的清晰,所以⼤家以后在写代码的时候要注意括号的使⽤,让代码的可读性更⾼。
下面介绍实现分支结构的另一个语句switch语句:
3. switch语句
3.1 语法形式
switch (expression)
{
case value1: statement
case value2: statement
default: statement
}
3.2 if语句和switch语句的对⽐
下面通过一个练习题,进行if语句和switch语句的对比:
练习题:输⼊任意⼀个整数值,计算除3之后的余数。
1. 使用if语句完成
#include <stdio.h>
int main()
{
int n = 0;
printf("请输入一个整数:\n");
scanf("%d", &n);
if (n % 3 == 0)
printf("整除,余数为0\n");
else if (n % 3 == 1)
printf("余数是1\n");
else
printf("余数是2\n");
return 0;
}
2. 使⽤switch语句完成
#include <stdio.h>
int main()
{
int n = 0;
printf("请输入一个整数:\n");
while (scanf("%d", &n) == 1)
{
switch (n % 3)
{
case 0:
printf("整除,余数为0\n");
break;
case 1:
printf("余数是1\n");
break;
case 2:
printf("余数是2\n");
break;
}
}
return 0;
}
运行结果:
使用不同的语句实现相同的功能,可见C语言的魅力。
上面代码中出现了break与default,下面我们展开介绍:
3.3 switch语句中的break
break既然在switch语句中出现了,就一定有它的作用,如果把其去掉,会出现什么情况呢?
下面我们来观察一下:
#include <stdio.h>
int main()
{
int n = 0;
printf("请输入一个整数:\n");
while (scanf("%d", &n) == 1)
{
switch (n % 3)
{
case 0:
printf("整除,余数为0\n");
case 1:
printf("余数是1\n");
case 2:
printf("余数是2\n");
}
}
return 0;
}
运行结果:
输入整数1,应该输出余数是1,却还输出了余数是2;输入整数2,输出正确;输入整数3,应该输出整除,余数是0,却还输出了余数是1,余数时2。
基于上面的情况,我们调整一下case的语序,观察不同:
#include <stdio.h>
int main()
{
int n = 0;
printf("请输入一个整数:\n");
while (scanf("%d", &n) == 1)
{
switch (n % 3)
{
case 1:
printf("余数是1\n");
case 2:
printf("余数是2\n");
case 0:
printf("整除,余数为0\n");
}
}
return 0;
}
运行结果:
可以观察到结果明显不同。
#include <stdio.h>
int main()
{
int day = 0;
while (scanf("%d", &day) == 1)
{
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;
}
运行结果:
#include <stdio.h>
int main()
{
int day = 0;
while (scanf("%d", &day) == 1)
{
switch (day)
{
case 1:
case 2:
case 3:
case 4:
case 5:
printf("工作日\n");
break;
case 6:
case 7:
printf("休息日\n");
break;
}
}
return 0;
}
运行结果:
3.4 switch语句中的default
#include <stdio.h>
int main()
{
int day = 0;
while (scanf("%d", &day) == 1)
{
switch (day)
{
case 1:
case 2:
case 3:
case 4:
case 5:
printf("工作日\n");
break;
case 6:
case 7:
printf("休息日\n");
break;
default:
printf("输入错误,请重新输入\n");
break;
}
}
return 0;
}
运行结果:
介绍了break和default后,下面介绍:
3.5 switch语句中的case和default的顺序问题
4. while循环
4.1 语法形式
while(表达式)//表达式成⽴(为真),则语句执⾏,表达式不成⽴(为假),则语句不执⾏。
{
语句;
}
4.2 执行流程
4.3 代码示例
//在屏幕上打印 1~10 的值
#include <stdio.h>
int main()
{
int i = 1;//定义变量i,并初始化为1。
while (i <= 10)
//i小于等于10,表达式成立,为真,语句执行,先打印i的值,再对i的值加1;i大于10,表达式不成立,为假,语句不执行。
{
printf("%d ", i);
i = i + 1;
}
return 0;
}
5. for循环
5.1 语法形式
for(表达式1; 表达式2; 表达式3)
//表达式1 ⽤于循环变量的初始化
//表达式2 ⽤于循环结束条件的判断
//表达式3 ⽤于循环变量的调整
{
语句;
}
5.2 执行流程
5.3 代码示例
//在屏幕上打印 1~10 的值
int main()
{
int i = 0;
// 初始化 判断 调整
for (i = 1; i <= 10; i++)
{
printf("%d ", i);
}
return 0;
}
和上面的代码对比一下:
运行结果:
6. do-while循环
6.1 语法形式
do
{
语句;
}while(表达式);
6.2 执行流程
6.3 代码示例
//在屏幕上打印1~10的值
#include <stdio.h>
int main()
{
int i = 1;
do
{
printf("%d ", i);
i = i + 1;
} while (i <= 10);
return 0;
}
运行结果:
为什么do-while语句使用最少?
原因是:⼀般 do while 使⽤在循环体⾄少被执⾏⼀次的场景下,所以较少⼀些。
下面通过一个练习题,来实现这种场景:
练习题:输⼊⼀个正整数,计算这个整数是⼏位数。
例如:
#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;
}
7. break语句和continue语句
7.1 while循环中的break和continue
7.1.1 break举例
#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;
}
运行结果:
7.1.2 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;
}
运行结果:
因程序陷入死循环,打印1,2,3,4 后,程序继续运行,不结束,故输出结果为图片所示。
7.2 for循环中的break和continue
7.2.1 break举例
#include <stdio.h>
int main()
{
int i = 1;
for (i = 1; i <= 10; i++)
{
if (i == 5)
break;
printf("%d ", i);
}
return 0;
}
运行结果:
7.2.2 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;
}
上面的代码跳过了5的打印。
运行结果:
7.3 do while循环中的break和continue
7.3.1 break举例
#include <stdio.h>
int main()
{
int i = 1;
do
{
if (i == 5)
break;
printf("%d ", i);
i = i + 1;
} while (i <= 10);
return 0;
}
运行结果:
7.3.2 continue举例
#include <stdio.h>
int main()
{
int i = 1;
do
{
if (i == 5)
continue;
printf("%d ", i);
i = i + 1;
} while (i <= 10);
return 0;
}
运行结果:
do.while 语句中的 break 和 continue 的作⽤和 while 循环中⼏乎⼀模⼀样。
8. 结言
本篇文章介绍了分支与循环的相关知识,篇幅较长,可以根据目录分部去看,希望对大家 学习C语言有所帮助,也希望大家多多支持,后续会带来更多创作(下一篇文章会运用循环的嵌套来进行牛刀小试-找出素数并打印)。