关于do{...}while(FALSE);

36 篇文章 37 订阅

今天看MFC的代码,无意中发现这样一种用法,当时觉得都do了,为什么接false啊,这样不就等于干执行一遍么?虽然大括号内恰好有什么改变XXX为true或者false的语句,但是while(FALSE)明显没用到那个变量。为什么多此一举,肯定不能那么简单,于是就查了一下,发现不光解释很多,争议也很多。


首先是这种语句可以顶替goto,而goto是不提倡用的(就不提某Turing Award winner和他的PASCAL之类的话题了,和我无关):

do{
if(condition1)
break;
if(condition2)
break;
.....
return;
}while(FALSE);
...
相应的goto用法:

if(condition1)
goto label;
if(condition2)
goto label;
....
return;
label:
........

都是随便一种条件就跳到最后,等于一个互斥操作

有人觉得下面这种更好:

if(!condition1&&!condition2&&......){return;}
显然他被个案迷惑了,没有想过什么叫通用性、灵活性和耦合性,不知道下边这种情况他怎么解决:

do{
if(condition1){
printf("condition1!");
break;
} if(condition2){
printf("condition2!");
 break;
}.....
return;
}while(FALSE);
...

不要以为这很幼稚,我看的代码真的就加了类似语句,发error message之类的。

也就是说,do{...}while(0); 可以实现类似 try{...}catch{}; 的功能。



有很多人强调:do{...}while(0); 主要是给宏定义用的。如下:

#define SAFE_DELETE(p) do{delete p;p = NULL}while(0);
//如果去掉do{}while(0);
#define SAFE_DELETE(p) delete p;p=NULL;
//那么诸如:
if(NULL != p) SAFE_DELETE(p)
else ..do sth...
//就会出现两个问题:
//1)if分支后有两个statement,导致else分支没有对应的if语句,编译错误。
//2)if后边跟两个语句,没有大括号,第二个语句必然永远都能执行。
但是个人觉得“天空飘来五个字,这都不算事儿”:

#define SAFE_DELETE(p) {delete p;p = NULL;}
这样不就完了?

大括号不大括号和do...while(); 没有直接联系吧?等验证一下~~~~






另外do{...}while(0); 还能缓解(某些情况)的多重嵌套。

比如用:

do{
if(!condition1)
break;
if(!condition2)
break;
do sth;
}while(FALSE);
代替:

if(condition1){
if(condition2){
do sth;
}
}
(为偷懒,少写基层~)



MFC中的例子:

#define AFXASSUME(cond) do{bool _afx_condVal = !!(cond);ASSERT(_afx_condVal);_analysis_assume(_afx_condVal);}while(0);
由此容易看出另外一个好处,就是宏定义有很多行的时候,大家都号称能起到保护作用(我经验浅,看的不是很直观)

还有我看的几段代码,没打开,也不贴了。

此外,《Linux设备驱动开发详解》3.5.3中应该有讲,这个是Linux内核中常用的方法,不要再说这种方法很少见很低级了~~~~~


MARK:有人说goto也挺好用的,他们公司用,没多少问题。有人讽刺他们公司都是高手,这么晦涩的代码都不出错。有人说用longjmp害死他,我也不懂这个longjmp。

PS:宏定义中的空格问题?我都忘得差不多了,没印象了,p = NULL这种有空格的应该没错吧,应该该行字符串有多长就定义多长?

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: jdkjrejvm 都是 Java 开发和运行环境相关的概念。jdkJava Development Kit 的缩写,是 Java 开发工具包,包含了编译器、调试器、文档生成器等开发工具。jreJava Runtime Environment 的缩写,是 Java 运行环境,包含了 JVMJava 库等运行时环境。而 JVMJava Virtual Machine 的缩写,是 Java 虚拟机,是 Java 程序运行的基础,它将 Java 代码编译成字节码并执行。简单来说,jdk 包含了 jrejre 包含了 JVM。 ### 回答2: JDKJava Development Kit),JREJava Runtime Environment)和JVMJava Virtual Machine)是Java开发和运行环境中的重要组件。 JDK是用于开发Java应用程序的软件包。它包含了编译Java源代码的编译器(javac)和其他开发工具,以及Java类库,使开发人员能够创建、编译和调试Java程序。JDK中还包含了JREJRE是用于在计算机上运行Java应用程序的环境。它包含了Java虚拟机(JVM)和Java类库,可以执行已经编译的Java字节码。JRE只包含运行Java程序所需的最低限度文件。 JVMJava虚拟机,是Java程序在计算机上运行的核心组件。它是一个能够执行Java字节码的虚拟计算机,负责解释和执行Java程序。JVM是跨平台的,可以在不同操作系统上运行相同的Java程序。JVM还负责Java程序的内存管理、垃圾回收和线程管理等任务。 因此,JDK包含了JRE,而JRE则包含了JVM。简而言之,JDK提供了完整的开发环境,JRE是用于执行Java程序的最小运行环境,而JVM负责在计算机上解释和执行Java字节码。三者之间有着密切的关系,构成了Java程序开发和运行的基础。 ### 回答3: JDKJava Development Kit)是Java开发工具包的缩写,它包含了开发Java程序所需要的工具和软件。 JREJava Runtime Environment)是Java运行时环境的缩写,它是运行Java程序所必需的软件。 JVMJava Virtual Machine)是Java虚拟机的缩写,它是一种虚拟计算机,能够执行Java字节码文件(.class文件)。JVM可以在不同的操作系统上运行,提供了内存管理、垃圾回收等功能。 JDKJREJVM之间关系如下:JDK包含JRE,同时还包含了开发Java程序所需要的编译器(javac)、调试器(jdb)等工具。JDK中的编译器可以将Java源代码(.java文件)编译成Java字节码文件(.class文件),而JVM可以解释和执行这些Java字节码文件。所以可以说,JDK是开发Java程序的工具包,其中包括了编译器和运行环境,而JRE只是运行Java程序所必需的运行环境。而JVM则是Java程序运行的环境,提供了虚拟计算机来执行Java程序。 总之,JDK是开发Java程序的工具包,包含了编译器和运行环境;JRE是运行Java程序所必需的运行环境;而JVMJava程序的执行环境,能够解释和执行Java字节码文件。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值