2017-02-06 43 views
-4

我在while循環的條件內嘗試了x+=1,x=x+1爲什麼while循環的條件表達式中賦值操作的行爲不同? (CPP)

x = 0 // Initial value of x 

第一殼體

while(x+=1 && x < 5){ 
    cout << x << endl; 
} 

第二殼體

while(x=x+1 && x < 5){ 
    cout << x << endl; 
} 

第一殼體和第二殼體令人費解。 x+=1x=x+1的行爲有什麼區別,它們都進入無限循環(由於短路)。但是,在第一種情況下x的值被卡在1.

有什麼想法?

根據Is x += 1 more efficient than x = x + 1?,大多數編譯器(好)優化和做完全相同的事情。

編譯器,我使用 - gcc版本5.4.0

+8

*我假設++運算符不返回任何內容*爲什麼假設?爲什麼不看它,看看它真的做了什麼? – NathanOliver

+7

「我假設++運算符不會返回任何內容」您錯誤地假設。 –

+0

如果'++'運算符「沒有返回任何東西」,那麼您將無法將其用作'&&'運算符的操作數。 – AnT

回答

5

你的困惑是缺乏括號的莖。您的表達式按順序等同於以下內容:

(x++) && (x < 5)  // First case 
x+=(1 && (x < 5)) // Second case 
x=((x+1) && (x < 5)) // Third case 

與隱式轉換等一起,這會產生您所看到的行爲。

這就是爲什麼我們使用括號並在編譯時啓用警告。

0

x++是一個增量爲x的表達式;它的值是x的舊值。因此,使用此代碼

int x = 0; 
std::cout << x++ << 'n'; 

輸出將爲0.嘗試一下。

在表達式x++ && x < 5中,x++的值爲0,並且0被視爲假。它是&&運算符的左側,因爲它是錯誤的,所以右側不進行評估;該表達式的值是false。嘗試一下。

的實施例中的其餘全部遞增的x值,所以在測試中,x值是1,這被視爲true&&操作者。這是第一個例子中的x++與第二個和第三個中的x += 1x = x + 1之間的差異。要使第一個人像其他人一樣行事,請將其更改爲++x && x < 5。在這種情況下,++x增量爲x,表達式的值是增量的結果。所以用

int x = 0; 
std::cout << ++x << '\n'; 

輸出將是1.試一試。

相關問題