C方法产生不一致的结果

时间:2018-03-07 05:14:02

标签: c

首先,我对Java编程非常熟悉,并且刚刚开始学习C编程。

下面是一个程序,它接受输入的整数并找到最小值,最大值和总和。

对我(至少)来说,编写的代码在正确执行所需的任务和功能方面似乎是合乎逻辑的。

#include <stdio.h>
#include <limits.h>

int sum(int array[], unsigned int length) {
    int sumTest;
    for (int i = 0; i < length; i++) {
        sumTest = sumTest + array[i];
    }
    return sumTest;
}

int max(int array[], unsigned int length) {
    int maxTest = array[0];
    for (int i = 0; i < length; i++) {
        if (array[i] > maxTest) {
            array[i] = maxTest;
        }
    }
    return maxTest;
}

int min(int array[], unsigned int length) {
    int minTest = array[0];
    for (int i = 0; i < length; i++) {
        if (array[i] < minTest) {
            array[i] = minTest;
        }
    }
    return minTest;
}

int main(void) {


unsigned int length = 0;
    scanf("%u", &length);
    int array[length];
    int temp = -1;
    for (int i = 0; i < length; i++) {
        scanf("%d", &temp);
        array[i] = temp;
    }

    printf("SUM: %d\n", sum(array, length));
    printf("MAX: %d\n", max(array, length));
    printf("MIN: %d\n", min(array, length));

    return 0;
}

但是,当我在控制台中键入一些条目时,结果每次都会有所不同。

1
10
SUM: 286271434
MAX: 10
MIN: 10

再次

1
10
SUM: -72217974
MAX: 10
MIN: 10

我的编译器会突出显示&#34;&lt;&#34;在min,max和sum三种方法中签署for循环告诉我我正在比较无符号整数和有符号整数。为了解决这个问题,我尝试将线条固定为这样。

for (unsigned int i = 0; i < length; i++) {

不幸的是我仍然得到相同的结果,这在逻辑上对我有意义,因为我已经读过无符号整数可以保存大的正数。我已经读过一些关于C更多关于内存管理的内容,我是不是可以将内存视为一个因素。事实上我已经完全从手册和论坛帖子中查找语法了,似乎没有人将内存视为一个因素,而且似乎与java没什么不同。

有人可以帮助我理解为什么会发生这种情况以及解决方案是什么。

谢谢。

4 个答案:

答案 0 :(得分:2)

在使用sumTest跟踪总和之前,你不会初始化int sum(int array[], unsigned int length) { int sumTest = 0; for (int i = 0; i < length; i++) { sumTest = sumTest + array[i]; } return sumTest; } ,因此值是不确定的。将其设置为0应解决问题:

TYP=a1
STAT_a1=statistical
FINAL_VARIABLE=${STAT_${TYP}} 

答案 1 :(得分:2)

初始化sum_test=0;

在找到最小值/最大值而不是保存临时值时,您可以修改数组。这应该解决它:

min_test = array[i];

答案 2 :(得分:1)

正如其他答案所指出的那样,sumTest需要在使用前初始化为0.

您可能还想测试

会发生什么
unsigned int length = 0;
scanf("%u", &length);
int array[length];

length输入一个非常大的值。

答案 3 :(得分:0)

您尚未初始化sumTest,因此它需要任何垃圾值。为了使它更有意义,将其初始化为0 即int sumTest = 0;