2011-07-28 60 views
7

我在看一些傳統的C代碼,糊塗了,這是一樣的東西:認沽條件檢查和變量賦值在一個if語句

UINT A, B = 1; 
if((A = B) == 1){ 
    return(TRUE); 
} else { 
    return(FALSE); 
} 

我們都知道會有一個編譯器警告,如果我們做,如果(A = B),但在這裏它看起來像對1的「如果」被檢查的,對嗎?

回答

10

首先,它分配的BAA = B)的值,則它檢查是否此分配,這是A和計算結果爲1的結果,等於1

因此從技術上講,你是正確的:在它的方式檢查A1

爲了讓事情更容易閱讀的代碼就相當於:

UINT A, B = 1; 
A = B; 
if(A == 1){ 
    return(TRUE); 
} else { 
    return(FALSE); 
} 
+3

僅僅因爲你可以按照寫在問題中的方式編寫代碼,並不意味着你應該這樣做。你應該總是喜歡寫在這個答案中的代碼,因爲它沒有歧義。 –

+6

如何是原來曖昧?你很清楚,這對我很清楚。 – baash05

5

相反,你的代碼總是分配BA,它是另外檢查是否B值(因而也A )等於1

沒有什麼是「遺產」這個,這通常是一個非常方便的成語,如果你需要一個操作的結果,而且要檢查錯誤:

int result; 
if ((result = foo()) != -1) 
{ 
    printf("The result is: %i\n", result); 
} 
else 
{ 
    // panic 
} 
+0

是啊你的富()檢查就像那些fopen()檢查。我在這裏看到的代碼更復雜一點,這讓我有點困惑...... – deddebme

0

正確的。在轉讓之後A具有的價值會相比,1

此代碼示例僅相當於:

return (TRUE); 
+0

確切地說,我想知道是否會出現這種情況,在這種情況下,任務會失敗。如果檢查是爲了回報Kerrek SB提到的函數的值。 – itisravi

+0

我希望這個問題能夠證明這一點.B通常是未知的。 – baash05

2

如果你想保持在1號線:

if ((A = B), A == 1) 

做同樣的事情。

0

我們試圖避免if語句使代碼更具可讀性。

UINT A, B = 1; 
bool fResult = false; 

fResult = (A == B); 

return(fResult); 

如果必須有條件對不平等進行操作,請參閱此示例。

UINT A, B = 1; 
bool fResult = false; 

fResult = (A == B); 

if(fResult) 
{ 
    doThis(); 
} 
else 
{ 
    doThat(); 
} 

return(fResult);