archim
驱动牛犊
驱动牛犊
  • 注册日期2001-08-18
  • 最后登录2006-03-17
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
阅读:1791回复:11

do {...} while(0) 这样的代码有什么用?

楼主#
更多 发布于:2003-05-06 11:10
linux sources里面有好些代码是写成

do
{...}
while(0)

这样的形式的。这样写有什么用意呢?

和直接写{}里面的语句相比有什么区别呢?


最新喜欢:

drirddrird XmanXman
archim
znsoft
管理员
管理员
  • 注册日期2001-03-23
  • 最后登录2023-10-25
  • 粉丝300
  • 关注6
  • 积分910分
  • 威望14796点
  • 贡献值7点
  • 好评度2410点
  • 原创分5分
  • 专家分100分
  • 社区居民
  • 最爱沙发
  • 社区明星
沙发#
发布于:2003-05-06 11:22
这种写法相当于window的消息队列,程序不断地取出信息进行处理。
http://www.zndev.com 免费源码交换网 ----------------------------- 软件创造价值,驱动提供力量! 淡泊以明志,宁静以致远。 ---------------------------------- 勤用搜索,多查资料,先搜再问。
hometown
驱动大牛
驱动大牛
  • 注册日期2002-10-24
  • 最后登录2004-05-21
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2003-05-06 14:49
一般在宏里使用, 可以避免在宏扩展的时候出现二义性
How fair and how pleasant art thou, O love, for delights!This thy stature is like to a palm tree, and thy breasts to clusters of grapes.I said, I will go up to the palm tree, I will take hold of the boughs thereof: now also thy breasts shall be as clusters of the vine, and the smell of thy nose like apples;And the roof of thy mouth like the best wine for my beloved, that goeth down sweetly, causing the lips of those that are asleep to speak.
archim
驱动牛犊
驱动牛犊
  • 注册日期2001-08-18
  • 最后登录2006-03-17
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
地板#
发布于:2003-05-06 15:19
原来如此
archim
Tomgin
驱动牛犊
驱动牛犊
  • 注册日期2001-08-08
  • 最后登录2005-06-06
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2003-05-08 13:05
有许多分支结构的程序用 if else 写很不清晰,

do while 加 break 能很好实现不满足条件时不执行后面的代码

应该是实现多分支结构的技巧吧
努力呀,还有许多东西不会呢。
longge
驱动中牛
驱动中牛
  • 注册日期2002-07-10
  • 最后登录2005-06-16
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2003-05-08 14:06
一般在宏里使用, 可以避免在宏扩展的时候出现二义性


这位老兄说的对,一般在定义复杂宏时用的!
除了记忆什么都带不走; 除了足迹什么都留不下。
brucezh
驱动老牛
驱动老牛
  • 注册日期2002-01-30
  • 最后登录2007-02-01
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2003-05-16 14:39
#define MACRO if(...) dosomething
 
...
if (a)
   MACRO;
else
   somecode;

展开:
if (a)
if (...)dosomething;
else
   somecode;

#define MACRO d0{if(...) dosomething}while(0)
 
...
if (a)
   MACRO;
else
   somecode;

展开:
if (a)
do
{
if (...)dosomething;
}
while(0);
else
   somecode;

关键在于do while(0)结构只进行一次。

打一枪……换个地方……再打一枪……
linzhu
驱动牛犊
驱动牛犊
  • 注册日期2003-05-15
  • 最后登录2003-05-17
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2003-05-17 18:16
hometown说的对,为了避免宏扩展时“;”带来的二义性,所以使用do
{
}
while(0)
结构
Tomgin
驱动牛犊
驱动牛犊
  • 注册日期2001-08-08
  • 最后登录2005-06-06
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2003-05-20 13:06
大家有没有见到不在 宏里的 do{}while(0)
努力呀,还有许多东西不会呢。
fly_fly
驱动牛犊
驱动牛犊
  • 注册日期2002-01-12
  • 最后登录2004-06-22
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2003-05-26 18:46
哦 原来
if (a)
{
   if (...)dosomething;
};
else
   somecode;
是错误的
zhanghuhu
驱动小牛
驱动小牛
  • 注册日期2002-11-30
  • 最后登录2005-02-27
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2003-05-26 20:20
哦 原来
if (a)
{
   if (...)dosomething;
};
else
   somecode;
是错误的
 

这样的代码会有语法错误,还比较容易查出,如果整段代码放到一个不到else的if语句中,又没有用花括弧括起来,那错误就更隐蔽了。

if(condition1)
  if(condition2)
  {
    if(condition3) dosomething;
  };
  else
    somecode;

else将会与if(condition1)配对。
多多交流
archim
驱动牛犊
驱动牛犊
  • 注册日期2001-08-18
  • 最后登录2006-03-17
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2003-05-27 09:08
所以我现在养成了习惯

不管if else后面是一条还是N条语句
都用{}括起来
archim
游客

返回顶部