2012-03-20 223 views
3

我想我會得到12,而不是7w++,那麼w將是4,這是100w++,w將是8,1000; 所以w++|z++100|1000 = 110012|運算符,++和I運算符

我怎麼了?

int main() 
{ 
    int w=3, z=7; 
    printf("%d\n", w++|z++); 
} 
+6

「我怎麼了?」我們不知道。 – 2012-03-20 04:41:59

+2

你可能沒問題......但你所考慮的運算符優先級不是:) – 2012-03-20 04:43:49

+0

你應該產生一個最小的例子來顯示你的問題..移除'x'和'i'和'scanf'位。 – 2012-03-20 04:45:25

回答

2

的問題是,通過使用w++|z++,你第一次使用的w的價值,或運算,通過的z當前值,然後遞增每個。改爲使用++w|++z,數字將第一個遞增,然後使用。

int main() 
{ 
    int x = 10; 

    // prints 10 
    printf("%d\n", x++); 
    // prints 11 
    printf("%d\n", x); 

    x = 10; 
    // prints 11 
    printf("%d\n" ++x); 
    // prints 11 
    printf("%d\n" x); 
} 

這也可以用--xx--來完成。有關更多信息,請參見this relevant question

3

您是誤解後綴++運算符。在之前使用變量的值,變量增加。您的分析對於前綴++運算符是正確的,如在++w|++z中。

2

這些是增量操作員;它們在之後生效的操作,所以在操作中使用3和7。

+0

實際上,當使用w ++ | z ++'時,'w'和'z'已經是'4'和'7',只是'w ++'和'z ++'評估舊值'w'和'z'。 – Mankarse 2012-03-20 04:55:12

+0

@Mankarse:固定。 – 2012-03-20 04:56:03

1

x++增量x,但它的計算結果爲舊值w

因此w++|z++評估爲3|7(在您的實施中恰好爲7),並將wz作爲副作用遞增。

如果你想,你是期望的行爲,你可以使用前綴操作符++x,這增加了x和計算結果爲x新值。

1

您正在執行後增量(i++),其中第一個值爲i,然後只增加它的值。

如果你想達到什麼樣的,你在你的問題說,這樣做:++w | ++z

0

你可能誤解了post-increment操作者是初學者中很常見的,所以不用擔心。隨着時間的推移,你會得到正確的。

看一下post-increment這個詞。有一個post字它通常表示after。這意味着增量將會發生after其他所有事情都已經被執行。這是我過去記住它的方式。

所以,如果你在你的程序看看現在 -

int main() 
{ 
    int w=3, z=7; 
    printf("%d\n", w++|z++); 
} 

那麼就會很清楚,printf功能本身已被執行後,增量會發生。因此,在printf的第二個參數表達式的評估中,您將分別得到wz的值爲37

官方C++ 11標準,(§5.2.6,最終版本)表示 -

後綴++表達式的值是它的操作數的值。 [注意:得到的值是原始值的副本 - 注完]

因此,這意味着後綴w++表達式的值,是操作數本身的值,也就是,w的值,這是3,第二個表達式z++的值將是7.這些值將被用於3|7的計算中,之後,這些變量將遞增。