對不起,這個簡單的問題,但我找不到答案,如果我有一個while循環,看起來像這樣。它是在比較之前還是之後計算的?雖然循環與++變量
a = 0;
while(a++ < 5)
{
....
當它第一次運行循環將它把它看成 「1 < 5」 或 「0 < 5」。由於
對不起,這個簡單的問題,但我找不到答案,如果我有一個while循環,看起來像這樣。它是在比較之前還是之後計算的?雖然循環與++變量
a = 0;
while(a++ < 5)
{
....
當它第一次運行循環將它把它看成 「1 < 5」 或 「0 < 5」。由於
比較完成之前的增加,但循環體看到價值後 icrementation。因此,在第一次運行中,您將比較0 < 5,但在循環中a的值將爲1.
如果它說++ a?增量是否在比較之前完成? – Fjodor 2014-10-31 08:56:34
@Fjodor:是的 - 它會在比較之前被執行,所以你實際上有1 <5 – 2014-10-31 09:11:08
後綴運算符應用於「之後」。前綴運算符在「之前」應用。如果您第一次提供「a」,則其值等於0
請小心,因爲如果不小心使用,可能會給這些操作員帶來麻煩。考慮[ix ++] = a [ix] + 1;也許它會做你想做的,也許不是...試試吧
只讀其他評論...非常好的一點,一個將採取++值insde循環。
無論它是否「有效」或沒有,「a [ix ++] = a [ix] + 1」未定義的行爲*,惡魔可能會飛出你的鼻子。 – 2014-10-28 19:17:06
這可能不是你想要的,取決於人們對鼻子惡魔的感受:-D – Dweeberly 2014-10-28 19:18:25
表達式a++
的結果是當前值a
,因此循環將從while (0 < 5)
開始。
表達式++a
的結果是a + 1
的值,所以如果你寫了while (++a < 5)
,它將以while (1 < 5)
開始。
在這兩種情況下,a
都會增加1,作爲副作用。請注意,在評估表達式後,不必立即應用副作用;唯一的保證是它在下一個序列點之前被應用(在這種情況下,序列點在條件表達式的末尾,因此循環體將會看到更新後的值a
)。所以,如果你有一個像
x = a++ * ++b;
表達這將是評估爲x = a * (b + 1)
,但不保證a
將++b
之前已經評價遞增,也沒有,要麼會前增加任何保證乘法和分配。下面是操作的許多可接受的順序之一:
t1 <- b + 1
x <- a * t1
b <- b + 1
a <- a + 1
'0 <5' ......... – BLUEPIXY 2014-10-28 19:13:54
你爲什麼不嘗試一下? 'printf('%d',a);'在循環中看看會發生什麼。 – 2014-10-28 19:14:00
@MarcB:因爲印刷的結果不會是確鑿的,甚至反直覺? – njzk2 2014-10-28 19:17:33