我想我會得到12
,而不是7
。 w++
,那麼w
將是4
,這是100
和w++
,w
將是8
,1000
; 所以w++|z++
將100|1000 = 1100
將12
。|運算符,++和I運算符
我怎麼了?
int main()
{
int w=3, z=7;
printf("%d\n", w++|z++);
}
我想我會得到12
,而不是7
。 w++
,那麼w
將是4
,這是100
和w++
,w
將是8
,1000
; 所以w++|z++
將100|1000 = 1100
將12
。|運算符,++和I運算符
我怎麼了?
int main()
{
int w=3, z=7;
printf("%d\n", w++|z++);
}
的問題是,通過使用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);
}
這也可以用--x
和x--
來完成。有關更多信息,請參見this relevant question。
您是誤解後綴++
運算符。在之前使用變量的值,變量增加。您的分析對於前綴++
運算符是正確的,如在++w|++z
中。
這些是後增量操作員;它們在之後生效的操作,所以在操作中使用3和7。
實際上,當使用w ++ | z ++'時,'w'和'z'已經是'4'和'7',只是'w ++'和'z ++'評估舊值'w'和'z'。 – Mankarse 2012-03-20 04:55:12
@Mankarse:固定。 – 2012-03-20 04:56:03
x++
增量x
,但它的計算結果爲舊值w
。
因此w++|z++
評估爲3|7
(在您的實施中恰好爲7),並將w
和z
作爲副作用遞增。
如果你想,你是期望的行爲,你可以使用前綴操作符++x
,這增加了x
和計算結果爲x
新值。
您正在執行後增量(i++
),其中第一個值爲i
,然後只增加它的值。
如果你想達到什麼樣的,你在你的問題說,這樣做:++w | ++z
你可能誤解了post-increment
操作者是初學者中很常見的,所以不用擔心。隨着時間的推移,你會得到正確的。
看一下post-increment
這個詞。有一個post
字它通常表示after
。這意味着增量將會發生after
其他所有事情都已經被執行。這是我過去記住它的方式。
所以,如果你在你的程序看看現在 -
int main()
{
int w=3, z=7;
printf("%d\n", w++|z++);
}
那麼就會很清楚,printf
功能本身已被執行後,增量會發生。因此,在printf
的第二個參數表達式的評估中,您將分別得到w
和z
的值爲3
和7
。
官方C++ 11標準,(§5.2.6,最終版本)表示 -
後綴++表達式的值是它的操作數的值。 [注意:得到的值是原始值的副本 - 注完]
因此,這意味着後綴w++
表達式的值,是操作數本身的值,也就是,w
的值,這是3,第二個表達式z++
的值將是7.這些值將被用於3|7
的計算中,之後,這些變量將遞增。
「我怎麼了?」我們不知道。 – 2012-03-20 04:41:59
你可能沒問題......但你所考慮的運算符優先級不是:) – 2012-03-20 04:43:49
你應該產生一個最小的例子來顯示你的問題..移除'x'和'i'和'scanf'位。 – 2012-03-20 04:45:25