C语言while循环语句顺序错误导致输出缺失的原因咨询
C语言循环输出缺失的原因分析
代码片段
#include <stdio.h> int main(void) { int n, sum = 0; printf("This program lists terms with each term being sum of previous terms and itself\n"); printf("Enter integers (0 to terminate): "); scanf("%d", &n); while (n != 0) { sum += n; scanf("%d", &n); printf("The sum is: %d\n", sum); } }
问题描述
当依次输入1、2、3、0时,预期输出为:
The sum is: 1 The sum is: 3 The sum is: 6
但实际运行时,The sum is: 6会被省略。只有交换循环内scanf("%d", &n);与printf("The sum is: %d\n", sum);的顺序,才能得到预期结果,请问原因是什么?
原因解析
核心问题出在循环内语句的执行顺序:
- 原代码的循环执行流程:
- 将当前输入的
n累加至sum - 立即读取下一个输入值到
n - 打印当前的
sum
- 将当前输入的
对应输入1、2、3、0的执行步骤:
- 第一次循环:
sum += 1(sum=1)→ 读取2 → 打印sum=1 - 第二次循环:
sum += 2(sum=3)→ 读取3 → 打印sum=3 - 第三次循环:
sum += 3(sum=6)→ 读取0 → 此时n=0,循环条件n != 0不成立,直接跳出循环,还未执行printf语句就退出了,因此sum=6的结果永远不会被打印
- 交换
scanf和printf顺序后,循环流程变为:- 将当前
n累加至sum - 先打印当前的
sum - 再读取下一个输入值到
n
- 将当前
此时第三次循环的执行步骤:sum +=3(sum=6)→ 打印sum=6 → 读取0 → 退出循环,所有预期结果都能正常输出
本质就是原代码中,最后一次计算出的sum还没来得及打印,就因为读取到终止符0直接跳出了循环。
内容的提问来源于stack exchange,提问作者userac67
相关产品推荐
相关产品推荐

