2014-10-28 221 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