首先,我对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没什么不同。
有人可以帮助我理解为什么会发生这种情况以及解决方案是什么。
谢谢。
答案 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;