虽然条件不正确,但C中的循环退出

时间:2016-10-11 06:16:43

标签: c loops while-loop

我新来的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,以及它们是否属于charwhile。例如,如果输入是status)则打破循环。但问题是我无法在任何地方找到确认或解释,为什么不检查1循环检查browser_stats_daily +----+-------------+----------------------------------------------------------------------+--------------+ | id | access_date | user_agent | num_requests | +----+-------------+----------------------------------------------------------------------+--------------+ | 6 | 2016-09-24 | Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0) | 4729 | | 10 | 2016-09-24 | Mozilla/5.0 (Windows NT 6.1; Trident/7.0; rv:11.0) like Gecko | 16396 | | 12 | 2016-09-24 | Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko | 33623 | | 17 | 2016-09-24 | MobileSafari/602.1 CFNetwork/808.0.2 Darwin/16.0.0 | 98 | | 28 | 2016-09-24 | Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; Trident/6.0) | 10333 | | 33 | 2016-09-24 | Mozilla/5.0 (Windows NT 6.3; WOW64; Trident/7.0; rv:11.0) like Gecko | 5745 | | 34 | 2016-09-24 | Mozilla/5.0 (compatible; AhrefsBot/5.1; +http://ahrefs.com/robot/) | 5 | | 46 | 2016-09-24 | Mozilla/5.0 (Windows NT 6.1; rv:49.0) Gecko/20100101 Firefox/49.0 | 339 | | 51 | 2016-09-24 | - | 13 | | 53 | 2016-09-24 | MobileSafari/601.1 CFNetwork/758.5.3 Darwin/15.6.0 | 38 | +----+-------------+----------------------------------------------------------------------+--------------+ 是否是精确整数user_agents +----+----------------+---------+----------+-------+-------+ | id | user_agent | vendor | platform | major | minor | +----+----------------+---------+----------+-------+-------+ | 2 | %Firefox/38.0% | Mozilla | Firefox | 38 | 38.0 | +----+----------------+---------+----------+-------+-------+

2 个答案:

答案 0 :(得分:4)

中删除&符号
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大小。

答案 1 :(得分:3)

  

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

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