两段看似相同的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)**的值:- 第一次循环(i=0):
scanf给x[0]赋值1,但x[1]还未被初始化,此时它的值是栈内存中的随机垃圾值,第一次累加的就是这个随机值; - 从第二次循环(i=1)开始,
scanf给x[1]赋值2,之后每次循环都会重复累加这个2; - 最终总和是「随机垃圾值 + 5*2」,这就是你得到22029这种奇怪结果的原因——随机值是不可预测的。
- 第一次循环(i=0):
正确代码的逻辑:
sum += *(x+i)表示每次循环累加刚输入的第i个元素的值,也就是依次把1、2、3、4、5、6加入总和,最终得到正确的21。
总结
这是一个典型的笔误:把循环变量i写成了常量1,导致累加目标完全错误。这类指针操作的问题很常见,写代码时要注意区分循环变量和固定索引。
内容的提问来源于stack exchange,提问作者Tony Hsiung
相关产品推荐
相关产品推荐

