【问题标题】:Compound conditions using while loop in C.在 C 中使用 while 循环的复合条件。
【发布时间】:2011-12-03 16:49:36
【问题描述】:

程序在 amt 为 0 时忽略停止,直到输入 10 个数字。该程序在输入 10 个数字后也不会停止。我的错误在哪里?

main() {
int amt;
int tot = 0; /* running total */
int i = 0;   /* counts number of times in loop */
while (amt!=0 || i < 10)
    {
     printf("Enter a number (enter 0 to stop): ");
     scanf("%d", &amt);
     tot = tot + amt;
     i++;
    }
printf("The sum of those %d number is %d.\n", i, tot);

}

【问题讨论】:

  • 请在此处发布之前编译您的代码并打开所有警告。任何体面的编译器都会告诉你类似“使用单元化值amt..”,并且main 的原型是不同的。
  • @JensGustedt - 您应该将其添加为答案。令人惊讶的是,甚至没有人认为编译器警告实际上可能会告诉您您的代码有问题。
  • @D.Shawley,不,不,我不希望 SO 被琐碎的事情所淹没。我只想结束这个问题,这对其他人没有任何用处。
  • 我正在使用 SSH 连接到我的学校并使用服务器中的编译器;当我编译程序时,没有出现错误。如何在 Windows 7 中使用 vim 作为编辑器的同时使用更好的编译器?
  • @jrasa,您的编译器可能有一个命令行开关或类似的开关来提高其警告级别。例如,对于 gcc,这是 -Wall。你的老师应该告诉你的。而且我认为在 Windows 上也有几个可用的现代编译器。

标签: c loops while-loop conditional-statements


【解决方案1】:

您的测试在分配amt 之前进行。因此其结果是不确定的。这个测试应该移到迭代的末尾,即do/while。虽然您可以将 amt 分配给某个非零值,但这对我来说有点不整洁。

您的意思是使用逻辑与而不是逻辑或吗?如果amti&lt;10 均非零,您只想继续迭代。

当然,如果您确实将测试移到了迭代的末尾,那么您将不得不考虑 i 在循环内已递增的事实。

【讨论】:

    【解决方案2】:

    为了在 10 个数字或 amt=0(以先遇到者为准)后停止,您必须将循环条件更改为 while (amt!=0 &amp;&amp; i &lt; 10)

    【讨论】:

    • 谢谢。这是正确的答案。该程序没有给出任何未定义的行为 - 它只是没有正确遵循条件。
    • @jrasa 该程序确实有未定义的行为。它尽可能简单。这个答案肯定不是全部。如果第一次测试时amt 恰好为零,则一旦更改为使用&amp;&amp;,您将不再进入循环。在您的程序版本中,未定义的行为是良性的,因为自 i
    • @jrasa 我完全同意上面的评论 - 尽管对您的输入数据很重要,但条件并不是唯一的问题。如果只改变条件,其他提到的因素可能会导致意想不到的结果。
    【解决方案3】:
    int amt;
    

    因为你没有初始化它。它有一些随机值,会导致程序中出现未定义行为。
    您应该始终使用值初始化局部变量。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-04-20
      • 1970-01-01
      • 2012-02-14
      • 2017-12-07
      • 1970-01-01
      • 2013-04-20
      • 1970-01-01
      相关资源
      最近更新 更多