do{}while(0) 的利用
发布于 11 年前 作者 DoubleSpout 7980 次浏览 最后一次编辑是 8 年前

最近在weibo看到一篇c++利用do{}while(0)来做流程控制,减少goto语句的重复代码量,感觉想法很不错,这里我们假设一个场景,让js也能利用一把do{}while(0)的妙处。 设计场景:

流程可能出现condtion4种情况,当出现condition1-3时,期望执行dosomething1,当出现condition4时,期望执行dosomething2,否则默认执行dosomething3, 同时我们要记录每个condition情况的日志,do_log 我们可能写出如下伪代码: 注,这里我们假设不能够利用switch…case

function if_else(condition){
if( condtion1 ){
 do_log_c1
 do_something_1
}
else if( condtion2 ){  
  do_log_c2           
  do_something_1
}
else if( condtion3 ){
        do_log_c3
        do_something_1
}
else if( condtion4 ){
        do_log_c4
        do_something_2 
}
else{
        do_log_c5
        do_something_3
}
}

这样我们就利用if和else完成了整个流程的代码,接下来我们利用do{}while(0) 来重写这个流程控制:

function do_while(condition){
   do{
       if( condition1){
         do_log_c1
         break;
       }
       if( condition2) {
         do_log_c2
         break;
       };
       if( condition3) {
         do_log_c3
         break;
       };
       if( condition4){
            do_log_c4
            do_something_2
            return;
        }
        else{
            do_log_c5
            do_something_3
            return;
           }
    }while(0);
   do_something_1;
}

这样我们就少写了几遍do_something_1这段代码了,感觉是不是很好?

4 回复

把break换成||不是更短么……

这样比较直观啊,干嘛要再引进个do … while呢?

function do_while(condition){
  if (condition1 || condition2 || condition3) {
    do_something_1;
  } else if (condition4) {
    do_something_2;
  } else {
    do_something_3;
  }
}

@boris @leizongmin 确实文章写的不够严谨啊,还有个需求是要根据condtion条件来记录不同的日志,这样do{}while(0)就可以起到一定的流程控制作用了,感觉属于魔法代码,见仁见智的利用吧

switch控制流程也可以

回到顶部