簡體   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