2017-01-31 87 views
1

我想將單行如果語句拆分爲多行if語句具有相同的含義。我有:將單行if語句拆分爲多行if語句

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

,但想改變它的東西一樣,如果我有

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

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

由於相同的含義!

+4

你爲什麼要這樣做?如果條件'a','b'和'c'太長,可以考慮爲這些條件寫簡短但具有描述性的名稱的方法。 'if(isLoggedIn(user)||(isGuest(user)&& guestCanEdit(topic)))' –

+1

你的問題是什麼?我不明白。 – Rohit

+0

我會寫一個更加明確的問題的擴展版本。所以if語句是 'if(list.isEmpty()||(!list.isEmpty()&& list.getLast()。compareTo(heap.peek()。value)<= 0))' 在while循環內運行。我在這裏要做的是計算'compareTo()'方法被調用的次數,我認爲我應該拆分if語句來更準確地計算它。 – henrich

回答

0

是的,你可以做到這一點,但也許你不應該這樣做。


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; 
    } 
} 

儘管沒有必要,被摧毀,就是你想要的。

0

的需要,這是不是很清楚,但你可以這樣做:使其在功能:

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

if (a) { 
    codeToDo(); 
else if (b) { 
    if (c) { 
    codeToDo(); 
    } 
} 
0
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)中,您正在運行相同的代碼;即任務1。

+0

處理兩次的評估,如果需要複雜的計算,則不太有效。如果發生副作用也是錯誤的。 – Aziuth

1

布爾代數可以把這個condiiton

一個|| (二& & C)

(A || B)& &(A || C)

所以你可以做財產以後這樣的:

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

我想這正是我一直在尋找的!謝謝! – henrich

+0

哦...非常好!不用謝!!! :) –

+0

@henrich請注意,現在您的第一個條件是'if(list.isEmpty()||!list.isEmpty())'。對於你的特定情況,你根本不需要外部的'if'。 –

1

你不能真正做到這一點不需要重複if塊的正文。您可以將a || b轉換爲!(!a && !b),但在使用&&時,由於周圍的!(...),您無法將其拆分爲嵌套if語句。

爲什麼你想這樣做呢?我的假設是,三個條件a,bc是非常長和/或複雜的。如果是這樣的話,我會建議下列之一:

  • 聲明描述性名稱個Boolean變量和使用那些在條件

    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))) { ... 
    

注意,howev呃,第一個版本不使用短路,即所有的條件都會被評估,即使第一個版本已經是真的,或者第二個版本是假的。如果計算成本昂貴或者例如如果第三次檢查只有在第二次檢查成功時纔可能發生(例如在null檢查後)。


關於你comment:條件

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

是不是真的長,我不會建議任何的這個上面的方法,因爲它不會得到更短的那種方式。但你可以縮短它,因爲b部分是多餘的。由於||短路,(b && c)只有當!a評價,因爲你的b!a,可以縮短它只是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,W ith a部分完全丟失。請注意,這是不相當於a || (b && c)了,但在這種情況下,這是一個很好的事情,因爲由於再次短路,compareTo實際上可以在a || c如果a已經評價true調用。

+0

這是真的@tobias_k if(list.isEmpty()|| list.getLast()。compareTo(heap.peek()。value)<= 0)'是一個更好的解決方案,謝謝你,但我再次不知道如何計算'compareTo()'被調用了多少次(在循環中),因爲有'||'條件:/? – henrich

+0

@henrich查看我的編輯。 –