`
kmplayer
  • 浏览: 512739 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

do{...}while(0)用途

 
阅读更多
这是一个奇怪的循环,它根本就只会运行一次,为什么不去掉外面的do{..}while结构呢?我曾一度在心里把它叫做“怪圈“。原来这也是非常巧妙的技巧。在工程中可能经常会引起麻烦,而上面的定义能够保证这些麻烦不会出现。下面是解释:

假设有这样一个宏定义
#define macro(condition) \
if(condition) dosomething()
   
现在在程序中这样使用这个宏:
if(temp)
   macro(i);
else
   doanotherthing();
  
一切看起来很正常,但是仔细想想。这个宏会展开成:
if(temp)
   if(condition) dosomething();
else
   doanotherthing();

这时的else不是与第一个if语句匹配,而是错误的与第二个if语句进行了匹配,编译通过了,但是运行的结果一定是错误的 。
为了避免这个错误,我们使用do{….}while(0) 把它包裹起来,成为一个独立的语法单元,从而不会与上下文发生混淆。同时因为绝大多数的编译器都能够识别do{…}while(0)这种无用的循环并进行优化,所以使用这种方法也不会导致程序的性能降低。

总结:

为了保证这段语句称为一个独立的语法单元,相当于增加了一个大括号.
分享到:
评论

相关推荐

    c代码-12、/*用do...while语句计算1到n的累乘之积,即计算n!*/

    `do...while`循环开始时,`factorial`乘以当前的`n`,然后`n`自减1,直到`n`变为1或0,循环结束。最后,程序打印出1到n的累乘之积。 `README.txt`文件通常包含项目或代码的说明,例如如何运行程序、代码的目的等。...

    static有什么用途.docx

    `do...while`先执行一次循环体再检查条件,而`while...do`先检查条件再执行循环体。 20. **代码输出** 代码中`a++`和`++a`的使用导致了变量a的值在不同地方被修改,最终输出结果为:b=10,c=12,d=120。 21. **...

    C语言小结.pdf

    最后,C语言具有结构化的控制语句,如if...else、while、do...while、switch、for等。 C语言的用途非常广泛,虽然不擅长科学计算和管理领域,但是对操作系统和系统实用程序以及对硬件进行操作方面,C语言有明显的...

    lecture_07.pdf

    总结起来,这份资料详细介绍了`while`循环的各种用途,包括计数、读取输入、使用`do...while`语句和解决实际问题,如计算斐波那契序列。通过这些练习,学生可以加深对C++循环结构的理解,并能够熟练地在实际编程中...

    大学C语言笔记[整理].doc

    - **结构化控制语句**:包括if...else、while、do...while、switch、for等,便于编写结构清晰的程序。 - **直接内存访问**:C允许程序员直接访问物理地址,进行位操作,因此可以直接对硬件进行操作。 - **高效的...

    C语言笔试[收集].pdf

    15. `do...while`和`while...do`的区别:`do...while`先执行循环体再判断条件,至少执行一次;`while...do`先判断条件再执行循环体,可能不执行。 16. 题目给出的代码输出:`b, c, d: 10, 12, 120`。这里涉及到了...

    C++笔记(初学).docx

    - 具备结构化控制语句,如if...else、while、do...while、switch、for。 - 语法相对宽松,允许直接访问物理地址,支持位操作,适用于底层硬件操作。 - 生成的目标代码质量高,执行效率高,且可移植性好。 2. **...

    大学C语言笔记.docx

    - **结构化控制语句**:如if...else、while、do...while、switch、for等,支持结构化编程。 - **直接访问物理地址**:C语言允许直接进行位操作,能直接对硬件进行操作,提高了编程灵活性。 - **高质量目标代码**...

    浅谈do {…} while (0) 在宏定义中的作用

    如果你是一名C程序员,你肯定很熟悉宏,它们非常强大,如果正确使用可以让你的工作事半功倍。...在Linux内核和其它一些著名的C库中有许多使用do{…}while(0)的宏定义。这种宏的用途是什么?有什么好处? Google的Robert

    完美版资料嵌入式CC最新面试题.doc

    - do...while先执行一次循环体再判断条件,而while...do先判断条件再执行循环体。 以上内容涵盖了C语言的基础知识,包括变量作用域、数据结构、排序算法、网络协议、内存管理等多个方面,这些都是嵌入式系统开发中...

    C语言终极面试宝典.docx

    do...while先执行一次循环体再检查条件,while...do先检查条件再执行循环体。 18. **static修饰全局变量、局部变量和函数**: - static全局变量只在定义它的源文件内可见,提供局部全局作用域。 - static局部...

    C语言软件工程师笔试题大全.docx

    17. **do...while与while...do的区别**: - `do...while`先执行循环体,再判断条件,至少执行一次。 - `while...do`先判断条件,条件满足才执行循环体,可能一次都不执行。 18. **静态全局变量、局部变量与函数**...

    c语言试题汇总不错的试题,面试前做做

    20. do...while与while...do的区别:do...while先执行循环体再判断条件,while...do先判断条件再执行循环体。 21. 代码输出:题目中的代码会输出b=10,c=12,d=120。这是因为`a++`和`++a`的差异,以及后缀自增和...

    C/C++面试题汇总

    16. do...while与while...do的区别: - do...while先执行循环体再判断条件,至少执行一次;while...do先判断条件再执行循环体,可能不执行。 17. 下列代码的输出: ``` int a, b, c, d; a = 10; b = a++; c =...

    C语言经典面试问答[已整理].pdf

    因此,do...while循环至少会执行一次,而while...do循环则在条件不成立时一次也不执行。 18. static变量、函数与普通变量、函数的区别 static变量与普通变量的区别主要在于作用域和链接属性。全局变量的作用域是...

    c与c++面试题汇总

    19. do...while 与 while...do 的区别: - do...while先执行循环体再判断条件,至少执行一次;while...do先判断条件再执行循环体,可能不执行。 20. 代码输出: - 当前代码段未完整给出,无法确定输出结果。但...

    C/C++

    21. **do...while与while...do的区别**:do...while先执行循环体再判断条件,而while...do先判断条件再执行循环体。 以上是C/C++编程语言中涉及的一些核心概念和特性,这些知识点是理解和编写C/C++程序的基础。

    (1912制作)C语言终极面试宝典

    do...while先执行一次循环体再判断条件,而while...do先判断条件再执行。 18. **static的作用** - 静态全局变量仅在声明它的文件内可见,提高了数据封装性。 - 静态局部变量在函数调用结束时不被释放,下次调用...

    C笔试 综合定义.docx

    16. `do...while`和`while...do`的区别在于循环条件的检查时机,前者先执行循环体再检查条件,后者先检查条件再执行循环体。 17. 示例代码的输出:`b, c, d: 10, 12, 120`,涉及到了自增运算符的顺序影响。 综上所...

Global site tag (gtag.js) - Google Analytics