【发布时间】: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 退出时,它确实停止了。
我认为它可能会检查您输入的值是否以 integer 或 long 开头,如果它们都不是(例如,如果输入是 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