2011-09-23 28 views
1

我一直在使用C++多年,但剛剛意識到增量作業有點可疑。遞增作業

我有這個片段

a = 4; 
    b = 2; 
    c = 0; 
    c = c + a > b; printf("a: %d\tb: %d\tc: %d\n",a,b,c); 
    c = c + a > b; printf("a: %d\tb: %d\tc: %d\n",a,b,c); 
    c += a < b; printf("a: %d\tb: %d\tc: %d\n",a,b,c); 
    c += a > b; printf("a: %d\tb: %d\tc: %d\n",a,b,c); 
    c += a > b; printf("a: %d\tb: %d\tc: %d\n",a,b,c); 

,其結果是

a: 4 b: 2 c: 1 
a: 4 b: 2 c: 1 
a: 4 b: 2 c: 1 
a: 4 b: 2 c: 2 
a: 4 b: 2 c: 3 

如果你注意,前兩行是相同的。或者'c'在第一個c = c + a> b之後沒有得到更新; 但是,當我們使用增量分配時,c的值會更新。+ =

有什麼想法?

+4

你有什麼想象應該發生?一切都完全如此。 –

+0

這屬於「醜陋」代碼:「>」運算符不是算術運算符,因此不應在算術語句或表達式中使用。當布爾類型和操作符不可用時(古代語言),這是很久以前的黑客攻擊。 –

回答

7

<的優先級低於+

c = c + a > b;被解釋爲c = (c + a) > b;

它僅僅是這樣,也並不需要是一個原因,但如果有一個,它可能是,人們往往比較算術表達式比使用比較的結果在算術表達式中。

+0

更經常! – James

2

在第一行中,c + a > b爲真,它轉換爲1,因此第一行讀取的內容爲c = 1;。沖洗並重復。

1

編譯器將您的代碼解釋爲c =(c + a)> b,您可能希望將它解釋爲c = c +(a> b)。