You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

两段看似相同的C语言代码为何输出结果不同?

为什么两段C语言求和代码输出结果不同?

你编写的两段代码核心差异在于累加操作的目标元素不同,这直接导致了结果的巨大差异:

错误代码(test.c)

#include <stdio.h>

int main() {

   int i, x[6], sum = 0;

   printf("enter 6 numbers: ");

   for(i = 0; i < 6; ++i) {
      scanf("%d", x+i);
      sum += *(x+1); // 问题出在这里
   }

   printf("Sum = %d", sum);

   return 0;
}

运行结果(输入1 2 3 4 5 6):

┌─[✗]─[shogun@parrot]─[~/Documents]
└──╼ $cd "/home/shogun/Documents/" && gcc test.c -o test && "/home/shogun/Documents/"test
enter 6 numbers: 1 2 3 4 5 6
Sum = 22029

正确代码(test2.c)

#include <stdio.h>
int main() {

  int i, x[6], sum = 0;

  printf("Enter 6 numbers: ");

  for(i = 0; i < 6; ++i) {
      scanf("%d", x+i);
      sum += *(x+i); // 这里使用了循环变量i
  }

  printf("Sum = %d\n", sum);

  return 0;
}

运行结果(输入1 2 3 4 5 6):

┌─[✗]─[shogun@parrot]─[~/Documents]
└──╼ $cd "/home/shogun/Documents/" && gcc test2.c -o test2 && "/home/shogun/Documents/"test2
Enter 6 numbers: 1 2 3 4 5 6
Sum = 21

问题原因分析

在C语言中,数组名x等价于指向数组第一个元素的指针,x+i表示指向数组第i个元素(索引从0开始)的指针,*(x+i)就是该元素的值。

  • 错误代码的问题:你在累加时写的是*(x+1),这意味着每次循环都在累加数组的**第二个元素(索引1)**的值:

    1. 第一次循环(i=0):scanf给x[0]赋值1,但x[1]还未被初始化,此时它的值是栈内存中的随机垃圾值,第一次累加的就是这个随机值;
    2. 从第二次循环(i=1)开始,scanf给x[1]赋值2,之后每次循环都会重复累加这个2;
    3. 最终总和是「随机垃圾值 + 5*2」,这就是你得到22029这种奇怪结果的原因——随机值是不可预测的。
  • 正确代码的逻辑:sum += *(x+i)表示每次循环累加刚输入的第i个元素的值,也就是依次把1、2、3、4、5、6加入总和,最终得到正确的21。

总结

这是一个典型的笔误:把循环变量i写成了常量1,导致累加目标完全错误。这类指针操作的问题很常见,写代码时要注意区分循环变量和固定索引。

内容的提问来源于stack exchange,提问作者Tony Hsiung

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 06:01:31