【问题标题】:While loop in C exited even when the condition is not true即使条件不成立,C 中的循环也会退出
【发布时间】:2016-10-11 06:16:43
【问题描述】:

我是 C 新手,由于某些工作要求(在此之前了解一些 java),我决定自己学习它。我希望我不会因为这个问题而被否决,因为我到处搜索 C 中的 while 循环、scanf() 的使用和变量赋值,看看我是否遗漏了什么,但没有任何解释为什么下面的代码运行即使对 while 循环的变量 status 的检查不再是 true。该程序取自教科书,但没有解释其工作原理,也只是一个示例。

#include <stdio.h>
#include <stdlib.h>

int main(void) {
    long num; 
    long sum = 0L; 
    int status;

    printf("Please enter an integer to be summed ");

    printf("(q to quit): ");

    status = scanf("%ld", &num);

    while (status == 1) {
        sum = sum + num; 
        printf("Please enter next integer (q to quit): ");
        status = scanf("%ld", &num);
    }

    printf("Those integers sum to %ld.\n", sum);

    return 0;   
}

当我在控制台上输入一个数字时(由scanf 读取为输入),据我了解,该数字已明确分配给变量status。但是,while 循环会检查每次迭代是否为status == 1 那么为什么当我输入要由scanf 读取的数字之后 while 循环开始并分配给status 循环继续?此时status 变量显然不再是1。但是,当我按照打印句子的建议输入 q 以输入 q 退出时,它确实停止了。

我认为它可能会检查您输入的值是否以 integerlong 开头,如果它们都不是(例如,如果输入是 char)打破循环。但问题是我无法在任何地方找到对此的确认或解释,为什么不检查while 循环检查status 是否是确切的整数1

【问题讨论】:

  • 你打错了:%1d --> %ld
  • 您不会将数字读入status。您将一个数字读入num,然后将status 分配给scanf 调用中读取的值数。只要输入任何有效数字,status 就会是 1
  • 为什么你认为status 变量不再是一个变量了?你说它“显然不再是 1”,但为什么不应该还是 1?
  • 当检查变量status 的while 循环不再是“真”时,你怎么知道'。'?尝试在 scanf 之后打印 status 值以确保。
  • @Darkphoton:读取和转换的值存储到变量中,该变量的地址作为参数传递给scanf。您可能从未见过或编写过存储scanf() 的返回值的代码。这个函数有很多怪癖,被广泛误解。仔细阅读规范并明智地使用。

标签: c loops while-loop


【解决方案1】:

删除&符号

printf("Those integers sum to %1d.\n", &sum);

应该是

printf("Those integers sum to %ld.\n", sum);

编辑 正如其他人指出的那样,%1d 中的那个是错字,它会导致您的scanf 读取一位数的int 值。将其替换为%ld('ell' 代表 'long')。 printf 中的类似 'l' 修饰符告诉函数它要打印的 int 的大小。

【讨论】:

  • 谢谢,我改了几个错别字(这本书太旧了,我一直把 l 读成 1),现在程序总和正确。
【解决方案2】:

但问题是我在任何地方都找不到对此的确认或解释,为什么不检查 while 循环是否检查状态是否为确切的整数“1”。

是的。而status 是来自scanf 的返回值,即读取的字段数。当且仅当读取了一个有效字段时,这将是一个。

【讨论】:

  • 这就是为什么,现在这很有意义。老实说,我在任何教程中都找不到将其与读取的字段数量进行比较的情况——到目前为止,当使用 scanf 读取值时,我习惯于将其存储为变量,然后使用它与其他内容进行比较.那么为什么status = scanf("%ld", &amp;num) 没有将状态分配给在控制台上输入的 long 实际上是返回值?
  • @Darkphoton: scanf 可以一次读取和转换多个字段。它需要额外的参数,每个转换后的字段都有一个地址。返回值是转换的字段数或EOF,如果在第一次转换之前遇到文件结尾。教科书中使用的名称status具有误导性,但在您的情况下,如果将数字转换并存储为num,它可以接收1,如果您键入不是数字的内容,则0,例如一封信,或EOF 在文件末尾。
  • @chqrlie:再次感谢,我在您上面的其他回复中回答了您的评论。是的,我同意变量名称使它更加混乱,所以我以错误的方式查看了分配。现在清楚多了,谢谢:)
猜你喜欢
  • 1970-01-01
  • 2017-04-10
  • 2021-11-18
  • 1970-01-01
  • 1970-01-01
  • 2018-12-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多