#include <stdio.h>
int main()
{
int i = 0;
do
{
printf("%d\n",i);
i ++;
}
while(i <= 10);
return 0;
}
运行结果:0 1 2 3 4 5 6 7 8 9 10
分析:上来不管三七二十一先给你执行一次循环体打印 i 的值,i ++ 后再对 i 进行判断,符合条件则继续执行循环,不符合就结束循环
【拓展】
在 do while 语句中同样可以使用 break 语句和 continue 语句
int i = 1;
do
{
if(5 == i)
break;
printf("%d\n",i);
i ++;
}
while(i <= 10);
运行结果:1 2 3 4
int i = 1;
do
{
if(5 == i)
continue;
printf("%d\n",i);
i ++;
}
while(i <= 10);
运行结果:1 2 3 4 死循环
如果上面的代码有不明白的可以翻看前面的 分支循环(一)和 分支循环(二)的博文
do while语句的特点:循环体至少执行一次,使用的场景有限,所以不是很常用
【练习部分】
【一、】
一道笔试题:
请问循环多少次?
#include <stdio.h>
int main()
{
int i = 0;
int k = 0;
for(i = 0,k = 0;k = 0;i ++,k ++)
{
k ++;
}
return 0;
}
答案:执行 0 次
分析:初始化循环变量 i 和 k ,但是在判断语句部分,表达式是 k = 0 ,在前面的博文我们提过,如果判断部分为 0 ,那么表示结果为假,循环体不被执行,很多人这里会错,原因是他们认为判断部分 k = 0 初始化部分 k 也为 0 ,所以条件符合执行循环体,这是错误的想法。
【二、】
①、关于 if 语句的说法正确的是()
A.if 语句后面只能跟一条语句
B.if 语句中 0 表示假,1 表示真
C.if 语句是一种分支语句,可以实现单分支,也可以实现多分支
D.else 语句总是和它的对齐的 if 语句匹配
答案:C
分析:A :明显是错误的,我们前面笔记说过,if或者else后面跟的代码多就要用 {} 将代码括起来,这就说明了 if 语句后面不可能只跟一条语句;B和C :很多人会纠结,觉得应该是个双选题,的确,在 0 表示假,但是表示真的我们说的是“非零整数”,所以相对于C而言我们选C,它挑不出任何问题;D :else 是与它离得最近的且未配对的 if 配对
②、下面代码中 func(1) = ()
A:30 B:20 C:16 D:0
int func(int a)
{
int b;
switch(a)
{
case 1:b = 30;
case 2:b = 20;
case 3:b = 16;
default:b = 0;
}
return b;
}
答案:D
分析:题目给了 func(1),意思是把 1 传给常数 a ,所以此时 a = 1,进入switch 的 case 1:中,此时 b = 30,由于没有 break 语句所以,继续往下执行其他的 case,一直到 b = 0;最后把 b 返回,所以 func(1) = 0
③、switch(c)语句中,c不可以是什么类型()
A.int
B.long
C.char
D.float
答案:D
分析:在前面的博文有讲过,不懂的看前面的博文;这里只讲一下 char 为什么可以,有人会问,char 不是字符类型的吗?怎么能满足 c 为整型的要求,其实,字符类型存在内存中的是这个字符对应的ASCII码值,ASCII码值是十进制的整数,所以也是整型的
④、下面代码运行后的结果:
#include <stdio.h>
int main()
{
int x = 3;
int y = 3;
switch(x % 2){
case 1:
switch(y)
{
case 0:
printf("first");
case 1:
printf("second");
break;
default:printf("hello");
}
case 2:
printf("third");
}
return 0;
}
答案:hellothird
分析:这里会做错那肯定是又忽略 break 这条语句存在和不存在时候的区别了,x = 3 模 2 == 1,所以执行第一个switch语句的case 1,进入第二个switch,因为 y = 3 ,但是没有 case 3 这个语句,所以执行 default 打印 hello,由于没有 break 语句,顾循环不会跳出,接着执行 case 2,打印 third,所以最终结果是:hellothird