【问题标题】:How does the decrement operator work in a while statement?减量运算符如何在 while 语句中工作?
【发布时间】:2013-07-30 17:27:52
【问题描述】:

我在 C 中有以下代码源:

#include<stdio.h>

void main()
{
    int i=0, x=3;
    while((x---1))
    {
        i++;
    }
    printf("%d", i);
}

这个 while 语句是如何工作的,为什么它打印 2 而不是 1?

【问题讨论】:

  • 我还是更喜欢--&gt; 运算符:while(x--&gt;0) {...}
  • @nneonneo 建议“x 归零”:) 数学家和 IOCCC 提交作者一定会喜欢这一点。
  • 我自己在玩具测试代码中使用过它,因为它比键入等效的 for 循环要容易得多。但是,如果我尝试真实提交它,维护人员可能会杀了我:)
  • 我无法想象你为什么会期望它打印 1。你应该解释你的想法。

标签: c while-loop decrement


【解决方案1】:

(x---1) == (x-- -1)

因为编译器会先选择更大的token,所以---被解释为-- & -

表达式x-- - 1 表示由于- 减法运算,首先从x 的当前值中减去 1。然后 x 值 递减 1,因为后缀递减运算符 --。

例如在第一次迭代之前x = 3,所以当条件是2(即3 - 1)之后,x 递减,并且在下一次迭代之前x = 2。

x = 3, i =0;

  • 1 次迭代: while(2),循环中 i 变为 1

x = 2, i = 1;

  • 2 次迭代: while(1),循环中的 i 变为 2

x = 1, i = 2;

  • 现在,x - 1 = 0 给出while(0) 和循环中断,i 不递增。

所以循环输出后i:2

请注意一点:i 不会随着循环中断而递增,因为 i++ 在 while 块 {} 中,但 x 递减为 0。如果您在循环后 printf x,则输出将是 0。

【讨论】:

    【解决方案2】:

    所以如果你用更多的空格来查看 while 可能更有意义:

    while( ( x-- - 1) )
    

    它使用的是后减量,所以 x 在返回它的当前值后被修改,所以它真的等同于这个:

    while( ( x - 1) )
    

    并且循环将一直运行,直到表达式为false,或者在本例中为0,它等价于false。所以运行是这样的:

    x   x - 1   i
    =============
    3     2     1    x - 1 not 0 so increment i
    2     1     2    x - 1 not 0 so increment i
    1     0     2    Loop exits here and does not increment i again
    

    此时循环退出并点击printf。

    【讨论】:

      【解决方案3】:

      while((x---1)) 等价于while((x-- -1 != 0)),这又与写while(x-- != 1) 相同。由于x--的值是x的值在减量之前,这与

      相同
      while(x != 1) {
          x--;
          ...
      }
      

      如果x 从 3 开始,则运行两次。

      【讨论】:

        【解决方案4】:

        因为x---1 实际上只是x-- - 1,它在递减x 之前产生x - 1 的值。

        鉴于x的初始值为3,循环运行2次(一次x = 3,一次x = 2,然后下一次x为1,所以x - 1为0,循环不再运行)。

        所以,i 从 0 开始,然后递增两次,因此最终为 2。

        【讨论】:

        • 谢谢,我现在意识到 x 仅由 x-- 语句递减。我不知道为什么我认为它被递减了两次:一次是 x-1,之后是 x-- 语句。但由于它不是 x=x-1,所以它不会通过这个改变它的值。不过我花了一段时间才搞定 :)
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-02-21
        • 1970-01-01
        • 2015-04-03
        • 2013-12-28
        • 1970-01-01
        • 1970-01-01
        • 2021-07-14
        相关资源
        最近更新 更多