繁体   English   中英

将单行if语句拆分为多行if语句

[英]Split single line if statement into multiline if statements

我试图将具有相同含义的单行if语句拆分为多行if语句。 我有:

 if(a || (b && c))
 {
    /* do smt */
 } 

但想将其更改为类似

if(a && b && c)
{
  /*do smt*/
}

具有相同的含义

if(a)
{
  if(b)
  {
     if(c)
     {
         /* do smt */
     }
  }
}

谢谢!

布尔代数可以满足这一条件

|| (b && c)变成

(a || b)&&(a || c)

因此您可以执行以下操作:

if(a || b)
 {
    if(a || c){
    /* do smt */
 } 
}

如果不重复if块的主体,则无法真正做到这一点。 您可以转换a || b a || b!(!a && !b) ,但是虽然它使用&& ,但是由于周围!(...)原因,您无法将其拆分为嵌套的if语句。

为什么首先要这样做? 我的假设是,三个条件abc都很长和/或很复杂。 如果是这种情况,我建议以下其中一项:

  • 声明三个具有描述性名称的布尔变量,并在条件中使用它们

     boolean isLoggedIn = // some really long data base lookup boolean isGuest = // more data base stuff boolean guestCanEdit = // a complex boolean expression if (isLoggedIn || (isGuest && guestCanEdit)) { ... 
  • 定义执行上述检查的三种方法,并在if

     if (isLoggedIn(user) || (isGuest(user) && guestCanEdit(topic))) { ... 

但是请注意,第一个版本不使用短路,即,即使第一个已经为真或第二个为假,也将评估所有条件。 如果任何条件在计算上昂贵,或者例如仅在第二次检查成功(例如在null检查之后)时才可能进行第三次检查,则应避免这种情况。


关于您的评论 :条件

if (list.isEmpty() || 
        (!list.isEmpty() && list.getLast().compareTo(heap.peek().value) <= 0))

是不是真的那么长,我不会建议任何的这个上面的方法,因为它不会得到更短的方式。 但是您可以缩短它,因为b部分是多余的。 由于||短路 (b && c)仅在!a求值,并且由于您的b !a ,您可以将其缩短a || c a || c

if (list.isEmpty() || list.getLast().compareTo(heap.peek().value) <= 0)

如果您的目标是计算调用compareTo次数,则可以使用以下代码:

if (! list.isEmpty() && list.getLast().compareTo(heap.peek().value) <= 0)

现在,这只是b && c ,用a部分完全丢失。 请注意,这等于a || (b && c) a || (b && c)了,但是在这种情况下,这很好,因为再次由于短路,实际上将不会a || c调用compareTo a || c如果a已经评估为true

是的,您可以执行此操作,但也许不可以。


if (a && b) statement;

完全等同于

if (a){
    if (b){
        statement;    
    }
}

但是对于if (a || b)则不能这样说:您需要编写statement; 在一个以上的地方:

if (a){
    statement;
} else if (b){
    statement;
}

就是说, || 确实分布&& ,即使具有短路特性:

所以

if (a || b && c/*redundant parentheses removed*/){
    statement;
}

可以写成

if ((a || b) && (a || c)){
    statement;
}

从上面是

if (a || b){
    if (a || c){
        statement;
    }
}

尽管您不必要混淆,但这正是您想要的。

对此的需求不是很清楚,但是您可以执行以下操作:在函数中进行操作:

function codeToDo() {
  // your code to execute on condition
}

if (a) {
  codeToDo();
else if (b) {
  if (c) {
    codeToDo();
  }
}
if(a || b)
 {
     if(a || c){
    /* do smt */
     }
 }

要进一步处理if(a||b)部分,请应用:

if(a){
   /*do task1*/
}else if(b){
   /*do task1*/
}

注意,在if(a)else if(b) ,您正在运行相同的代码;即task1。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM