2014-10-28 179 views
0

對不起,這個簡單的問題,但我找不到答案,如果我有一個while循環,看起來像這樣。它是在比較之前還是之後計算的?雖然循環與++變量

a = 0; 
while(a++ < 5) 
{ 
    .... 

當它第一次運行循環將它把它看成 「1 < 5」 或 「0 < 5」。由於

+2

'0 <5' ......... – BLUEPIXY 2014-10-28 19:13:54

+1

你爲什麼不嘗試一下? 'printf('%d',a);'在循環中看看會發生什麼。 – 2014-10-28 19:14:00

+0

@MarcB:因爲印刷的結果不會是確鑿的,甚至反直覺? – njzk2 2014-10-28 19:17:33

回答

2

比較完成之前的增加,但循環體看到價值 icrementation。因此,在第一次運行中,您將比較0 < 5,但在循環中a的值將爲1.

+0

如果它說++ a?增量是否在比較之前完成? – Fjodor 2014-10-31 08:56:34

+0

@Fjodor:是的 - 它會在比較之前被執行,所以你實際上有1 <5 – 2014-10-31 09:11:08

1

後綴運算符應用於「之後」。前綴運算符在「之前」應用。如果您第一次提供「a」,則其值等於0

請小心,因爲如果不小心使用,可能會給這些操作員帶來麻煩。考慮[ix ++] = a [ix] + 1;也許它會做你想做的,也許不是...試試吧

只讀其他評論...非常好的一點,一個將採取++值insde循環。

+1

無論它是否「有效」或沒有,「a [ix ++] = a [ix] + 1」未定義的行爲*,惡魔可能會飛出你的鼻子。 – 2014-10-28 19:17:06

+0

這可能不是你想要的,取決於人們對鼻子惡魔的感受:-D – Dweeberly 2014-10-28 19:18:25

1

表達式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之前已經評價遞增,也沒有,要麼會前增加任何保證乘法和分配。下面是操作的許多可接受的順序之一:

  1. t1 <- b + 1
  2. x <- a * t1
  3. b <- b + 1
  4. a <- a + 1