【问题标题】:While loop with ++variable带 ++ 变量的 while 循环
【发布时间】:2014-10-28 19:12:33
【问题描述】:

很抱歉这个简单的问题,但我找不到答案,如果我有一个看起来像这样的 while 循环。是在比较之前还是之后计算?

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

当它第一次运行循环时,它会将其视为“1

【问题讨论】:

  • 你为什么不试试呢? printf('%d', a); 在循环中看看会发生什么。
  • @MarcB:因为打印的结果不会是决定性的,甚至是反直觉的?
  • @njz:它会打印 a 的次数与执行内部循环的次数一样多,这会告诉您 while() 条件何时成功/失败。
  • 甚至比尝试或询问其他人更好:完全摆脱 ++ 并编写干净、可读的代码。
  • 我可以建议一个简单的在线搜索'c 运算符优先级'

标签: c loops while-loop


【解决方案1】:

比较是在BEFORE 增量中完成的,但是循环的主体会看到值AFTER 增量。因此,在第一次运行中,您将比较 0

【讨论】:

  • 如果它说 ++a 怎么办?是否会在比较之前完成增量?
  • @Fjodor :是的 - 然后它会在比较之前执行,所以你实际上有 1
【解决方案2】:

后缀运算符应用于“之后”。前缀运算符应用于“之前”。如果您在第一次比较“a”时提供的值将等于 0

小心,因为如果不小心使用这些运算符,您可能会遇到麻烦。考虑 a[ix++] = a[ix] + 1;也许它会做你想做的,也许不是……试试看

只需阅读其他评论...非常好的一点,a 将在循环中采用 ++ 值 insde。

【讨论】:

  • 不管它是否“有效”,a[ix++] = a[ix] + 1 都是未定义的行为,恶魔可能会飞出你的鼻子。
  • 这可能不是你想要的,这取决于人们对鼻恶魔的感觉:-D
【解决方案3】:

表达式a++ 的结果是a 的当前值,因此循环将以while ( 0 &lt; 5 ) 开始。

表达式++a 的结果是a + 1 的值,所以如果你写了while ( ++a &lt; 5 ),它会以while ( 1 &lt; 5 ) 开头。

在这两种情况下,a 都会增加 1 作为副作用。请注意,不必在计算表达式后立即应用副作用;唯一的保证是它在下一个序列点之前应用(在这种特殊情况下,序列点位于条件表达式的末尾,因此循环体将看到a 的更新值)。所以,如果你有这样的表达方式

x = a++ * ++b;

它将被评估为x = a * (b + 1),但不能保证a会在++b被评估之前增加,也不能保证在评估之前a会增加乘法和赋值。以下是许多可接受的操作顺序之一:

  1. t1 &lt;- b + 1
  2. x &lt;- a * t1
  3. b &lt;- b + 1
  4. a &lt;- a + 1

【讨论】:

    猜你喜欢
    • 2019-05-17
    • 2023-04-10
    • 2022-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-07
    • 2014-08-09
    • 2013-02-25
    相关资源
    最近更新 更多