[英]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
語句。
為什么首先要這樣做? 我的假設是,三個條件a
, b
和c
都很長和/或很復雜。 如果是這種情況,我建議以下其中一項:
聲明三個具有描述性名稱的布爾變量,並在條件中使用它們
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.