c语言do while语句是什么呢?不知道的小伙伴来看看小编今天的分享吧!
do-while循环的格式:
do{
Statement _1;
Statement _2;
}while(Exp_cntrl);//分号不可丢
当循环体为一条简单语句时,可以省略 {},即:
do
Simp1e_Statement;//循环体
while(Exp_cntrl);
注意,在 do-while 结构中,while 括号后的分号不能丟。
do-while 循环的执行流程是:首先无条件地执行一次循环体,然后再根据循环控制表达式的值来判断是否继续执行循环体。若为真,则继续执行;若为假,则停止执行,退出 do-while 循环。也就是说,do-while 循环至少执行一次循环体。
do-while 循环和 while 循环的主要差别是:前者至少执行一次循环体,后者有可能一次也不执行循环体。
do-while 循环的执行流程图:
do-while 循环主要用在一直进行尝试性的操作,直到满足条件为止的情景。
【例】编程实现猜数字游戏,假设谜底为 0〜10 的整数,猜谜者每次输入一个整数,直到猜对为止。
分析:本题属于先输入所猜数字才能判断是否猜中,如果猜中,游戏结束,如果没猜中,继续猜,直到猜中为止。故该题符合 do-while 循环的使用场景。
代码如下:
#include<stdio.h>
int main (void){undefined
int pwd=7,gs; //pwd:谜底
printf ("\tGames Begin\n");
do{undefined
printf("Please guess (0~10):");
scanf("%d",&gs);
}while(gs!=pwd);
printf ("\tSucceed!\n");
printf ("\tGaines over\n");
return 0;
}
运行结果:
Games Begin
Please guess (0~10):3
Please guess (0~10):5
Please guess (0~10):8
Please guess (0~10):7
Succeed!
Gaines over
以上就是小编今天的分享了,希望可以帮助到大家。
C语言新手绝对不知道的do{...}while(0)的秒用
C语言中do{...}while(0)的秒用
今天看了些有关do{...}while(0)秒用的文章,觉得写的很好,这里总结下分享给大家。
这里分享的有3个用法,分别是:
1.避免空的宏定义在编译时出现warning。
2.多个语句一起,定义成一个宏时,增加代码适应(特别是条件语句调用这类宏要注意)
3.避免部分goto语句的使用
1.避免空的宏定义在编译时出现warning
//例如:
#define foo() do{}while(0)
2.多个语句一起,定义成一个宏时,增加代码适应(特别是条件语句调用这类宏要注意),以下if(0)和if(1)在实际应用时是if(表达式),表示表达式假和真。
//例如:一个宏包含以下两个语句,
#define foo()
fun1();
fun2;
编译器预处理的时候
if(1)foo();
//此时就相当于下面的语句,
if(0)fun1();
fun2();//逻辑上多执行的代码,会导致系统BUG
;//逻辑上多执行的代码
如果使用do{...}while(0)就可以解决上面的问题
#define foo()
do{
fun1();
fun2();
}while(0)
//对于下面的语句
if(0) foo();
//编译后的执行如下:
if(0) do{
fun1();
fun2();
}while(0);
这样就不会出现上面那种有逻辑上不该执行的代码被执行的问题。当然这里也可以用其他方法避免这个问题,比如加大括号{}
#define foo() {fun1();fun2;}
编译器会预处理下面语句
if(0) foo();
//编译后的执行如下:
if(0) {
fun1();
fun2();
}
;//会多个;号,但是也没有逻辑上的问题
语句块宏定义时注意的就是这些,另外在写if语句时,尽量后面要加大括号,避免出错,例如上面的if(0){foo();},加上大括号{}也不会有问题。
3.避免部分goto语句的使用
//例如:如果一个函数要分配一些资源,然后中途遇到错误,要退出函数,退出前要释放资源,代码结构可能如下:
bool foo(){
int *p = (int*)malloc(5*sizeof(int));
bool bOk = true;
//执行并处理错误
bOk = fun1();
if(!bOk){
free(p);
p=NULL;
return false;
}
bOk = fun2();
if(!bOk){
free(p);
p=NULL;
return false;
}
bOk = fun3();
if(!bOk){
free(p);
p=NULL;
return false;
}
//......
//执行成功,释放资源并返回ture
free(p);
p = NULL;
return true;
}
这里就觉得很多代码冗余,然而使用沟通可以很好的解决冗余的部分,代码如下:
bool foo(){
int *p = (int*)malloc(5*sizeof(int));
bool bOk = true;
//执行并处理错误
if(!fun1()) goto errorlable;
if(!fun2()) goto errorlable;
if(!fun3()) goto errorlable;
//......
//执行成功,释放资源并返回ture
free(p);
p = NULL;
return true;
//冗余部分的,错误返回代码
errorlable:
free(p);
p = NULL;
return false;
}
然后C语言中过多的使用goto语句会提高程序的灵活性,繁杂点的程序会让程序员捉摸不定,程序跳来跳出,难以捉摸,容易逻辑上产生混淆从而出现BUG。对于上面的这种情况使用do{...}while(0)就可以很好的解决这些跳来跳出的问题,代码结构如下:
bool foo(){
//分配资源
int *p = (int*)malloc(5*sizeof(int));
bool bOk = true;
//执行并处理错误
do{
bOk = fun1();
if(!bOk)break;
bOk = fun2();
if(!bOk)break;
bOk = fun3();
if(!bOk)break;
//......
}while(0);
//释放资源并返回bOk
free(p);
p = NULL;
return bOk;
}