【问题标题】:Why the output is infinite?为什么输出是无限的?
【发布时间】:2012-11-21 21:53:41
【问题描述】:
int i;
while(i=10)
{
    printf("%d\n",i);
    i=i+1;
}

有一个程序,其中 while(i=10) 表示 while(1)[通常] 表示 while 循环为真。所以它应该只打印一次 10 并将 i 的值增加 1 即 i 变为 11。但输出是无限打印'10'重复。为什么会这样? 我的平台是:64 位 Windows 7 和 32 位 Dev C++ 编译器。

【问题讨论】:

  • while (i=10) 是一个作业。 i < 10 并初始化 i.
  • 在下一次迭代中,i的值再次变为10,循环条件变为真,因此无限继续。
  • 一位名叫 Lee 的聪明年轻程序员 / 想在 i 3 岁时循环 / 但在写 = 时 / 他忘记了续集 / 因此无限循环

标签: c++ c loops while-loop infinite-loop


【解决方案1】:

在while循环中查看,

while(i=10) // assigns the value 10 to the i which is always true (becuase any non-zero value is true in such a case).

你使用的是assignment operator=所以这个赋值返回的值是rvalue的值1010将永远为真。

这就是无限循环的原因。

您应该在 while 循环中使用 while(i == 10)while(i < = 10) 或任何比较运算符。

比较运算符结果为1(true) 或0(false)。当while(cond) cond 为false 时循环终止。

【讨论】:

  • 它应该只打印 10 一次。为什么无限?
  • 为什么@SahilGarg ?:每次修改循环内i 的值时查看,但在while 循环的条件部分再次将值10 放入i .并且返回相同的内容...我认为您没有在看我的答案。它解释了一切。如果你不明白,请告诉我
  • 赋值和比较我已经解释清楚了。毫无疑问
【解决方案2】:

while(i=10)i 设置为10,然后对其进行检查,即将其转换为truefalse。只有0false,所以每次都变成true,因此永远循环。

我猜你想要while(i==10)。 Double = 表示“检查相等性”。单个= 表示“设置值”。

编辑:事实上,我不确定你想要什么。如果您没有在循环之前初始化i,那么也许您确实打算在条件中设置它。在这种情况下,为什么每次都将其设置为 10

再次编辑:好的,所以您的评论,您确实的意思是在条件中设置它。所以你需要了解这种情况是如何运作的。你写的实际上是这样的:

while ( (bool)(i=10) )

这会将i 设置为10,然后将10 转换为bool,它始终为true。然后在循环中,i 递增到11。然后当它回到循环顶部时,它立即将i 设置回10。所以你实际上是在做:

set i to 10; <-----\
print i (=> 10);    |
set i to 11;        |
go back to the top; /

【讨论】:

  • 我知道条件是错误的。我在 while 运算符中将 10 分配给 i。但是为什么 ans 是无限的并且 i 没有增加到 11 或更多,为什么?
  • 因为你一直把它设置为 10。
【解决方案3】:
  while(i=10)

条件不对! 其实不是条件!

你应该写

while(i<10)

【讨论】:

  • 这仍然是一个条件。它只是计算出与i==10 不同的东西。
【解决方案4】:

我认为您想在 while 条件中使用双等号(比较)而不是单等号(赋值)。您还应该将变量 i 初始化为 10(否则将永远不会执行 while 块)。

int i=10;
while (i==10)
{
    printf("%d\n",i);
    i=i+1;
}

【讨论】:

    【解决方案5】:

    我认为您缺少的关键是条件语句在循环的每次迭代中执行。因此,i=10 对循环的每次迭代都执行(并针对零进行测试),而不仅仅是第一次。

    你的代码相当于这样:

    int i;
    int j = (i=10);
    while(j)
    {
        printf("%d\n",i);
        i=i+1;
        j = (i=10);
    }
    

    其中j = (i=10); 等价于i = 10; j = i;

    所以步骤变成:

    1. 10 分配给i,并将结果引用(i) 中的值分配给j(分配按约定返回引用或指针)。
    2. 如果值为真(总是如此),则执行循环块
      1. 致电printf
      2. 递增i
      3. 10 分配给i,并将结果引用(i) 中的值分配给j

    如果从分配返回的值为零,则测试分配的 while 循环只能失败/停止循环。

    实际上,像这样编写循环是不好的风格,因为它们看起来与非常常见的while(i==10) 相等检查太相似了。有时在使用对象时会测试赋值的返回值,例如while(nextObjPtr = collection.getNextObj()),因为一旦getNextObj 返回空指针,它就会失败。然而,即使这样,也会更明确地写出来:

    while((nextObjPtr = collection.getNextObj()) != nullptr)
    

    或 C++11 之前的版本:

    while((nextObjPtr = collection.getNextObj()) != NULL)
    

    【讨论】:

      【解决方案6】:

      在您的 while 条件部分中,您将值分配给 i 而不是进行比较

       while(i=10)
      

      当程序编译成功时,这种类型的错误很难跟踪。 为避免此类错误,请按 reverse 顺序进行比较

      while(10==i) or if(10==x) 等等。

      如果你错误地使用了 while(10=i) ,编译器会抛出类似的错误

      The left-hand side of an assignment must be a variable, property or indexer
      

      节省以后调试的宝贵时间。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-08-21
        • 1970-01-01
        • 1970-01-01
        • 2022-08-02
        • 1970-01-01
        • 1970-01-01
        • 2020-02-20
        相关资源
        最近更新 更多