2008-09-30 13 views

回答

80

它比循環語句更有用。

while(var = GetNext()) 
{ 
    ...do something with var 
} 

,否則必須寫入

var = GetNext(); 
while(var) 
{ 
...do something 
var = GetNext(); 
} 
+8

我同意 - 但會寫:while((var = GetNext() )!= 0){...}不用兩次思考,部分原因是GCC抱怨如果我沒有使用我的默認編譯選項。 – 2008-10-08 22:08:47

+1

是的。假設您正在使用支持for-loop聲明的語言,並且您尚未在循環之外使用var。 – Gerald 2012-10-24 16:02:51

+0

在某些語言中,如ANSI C,作用域規則不允許使用這種方法,@KerrekSB – wirrbel 2013-10-09 16:30:18

22

如果你調用返回要麼數據上工作的功能或一個標誌,指示錯誤它可能是有用的(或你完成了)。

喜歡的東西:

while ((c = getchar()) != EOF) { 
    // process the character 
} 

// end of file reached... 

個人這是一個成語,我不喜歡巨大的,但有時選擇是醜陋。

28

它,如果你調用一個函數更爲有用:

if (n = foo()) 
{ 
    /* foo returned a non-zero value, do something with the return value */ 
} else { 
    /* foo returned zero, do something else */ 
} 

當然,你可以把N = FOO();在一個單獨的聲明然後如果(n),但我認爲上面是一個相當可讀的習慣用法。

+0

我想你應該括在括號或GCC會抱怨有: 警告:建議用作真值的賦值語句前後括號[-Wparentheses] 像這樣: IF((N =(foo())){ //做一些返回值 } else { // foo返回零/ NULL,做別的事 } – 2015-07-17 12:41:37

8

當您編寫while循環而不是if語句時,該成語更有用。對於if聲明,您可以按照您的描述將其分解。但是,如果沒有這個結構,你要麼不得不重複自己:

c = getchar(); 
while (c != EOF) { 
    // ... 
    c = getchar(); 
} 

或使用循環和半結構:

while (true) { 
    c = getchar(); 
    if (c == EOF) break; 
    // ... 
} 

我通常喜歡環路和A-一半的形式。

8

GCC可以幫助您檢測(用-Wall),如果你無意中嘗試使用賦值爲真值,如果它建議你寫

if ((n = foo())) { 
    ... 
} 

即使用額外的括號來表明這真的是你想要的。

3

在PHP中,例如,它是有用的,通過SQL數據庫結果循環:

while ($row = mysql_fetch_assoc($result)) { 
    // Display row 
} 

這看起來不過如此:

$row = mysql_fetch_assoc($result); 
while ($row) { 
    // Display row 
    $row = mysql_fetch_assoc($result); 
} 
23

我發現它通常涉及錯誤檢測等行爲鏈條中最有用。

if ((rc = first_check(arg1, arg2)) != 0) 
{ 
    report error based on rc 
} 
else if ((rc = second_check(arg2, arg3)) != 0) 
{ 
    report error based on new rc 
} 
else if ((rc = third_check(arg3, arg4)) != 0) 
{ 
    report error based on new rc 
} 
else 
{ 
    do what you really wanted to do 
} 

替代(未使用中的條件分配)是:

rc = first_check(arg1, arg2); 
if (rc != 0) 
{ 
    report error based on rc 
} 
else 
{ 
    rc = second_check(arg2, arg3); 
    if (rc != 0) 
    { 
     report error based on new rc 
    } 
    else 
    { 
     rc = third_check(arg3, arg4); 
     if (rc != 0) 
     { 
      report error based on new rc 
     } 
     else 
     { 
      do what you really wanted to do 
     } 
    } 
} 

隨着長期錯誤檢查,替代可以運行頁面而分配合條件版本的關閉RHS不這樣做。

2

另一個優點是在gdb的使用過程中。 在以下代碼中,如果我們要單步執行,則不知道錯誤代碼。

while (checkstatus() != -1) { 
    // process 
} 

而是

while (true) { 
    int error = checkstatus(); 
    if (error != -1) 
     // process 
    else 
     //fail 
} 

現在在足下,我們可以知道什麼是從的checkStatus返回錯誤代碼()。

-2

的原因是:

  1. 性能改進(有時)

  2. 小碼(始終)

以一個例子:有一個方法someMethod()並在if您要檢查該方法的返回值是否爲null。如果不是,你將再次使用返回值。

If(null != someMethod()){ 
    String s = someMethod(); 
    ...... 
    //Use s 
} 

由於您調用同一方法兩次,它會妨礙性能。而是使用:

String s; 
If(null != (s = someMethod())) { 
    ...... 
    //Use s 
} 
相關問題