对不起,这个简单的问题,但我找不到答案,如果我有一个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