同样的代码在C和Java中给出不同的答案,你能帮我吗?

同样的代码在C和Java中给出不同的答案,你能帮我吗?,java,c,portability,Java,C,Portability,这些分别用C和Java编写的代码片段应该会输出相同的结果,但它们不会,而且我无法确定错误在哪里 用C写的 #include <stdio.h> /* discover and print all the multiples of 3 or 5 below 1000 */ int main() { int sum, counter = 1; while (counter < 1000) { printf("Calculating...\n"

这些分别用C和Java编写的代码片段应该会输出相同的结果,但它们不会,而且我无法确定错误在哪里

用C写的

#include <stdio.h>
/* discover and print  all the multiples of 3 or 5
below 1000 */

int main() {

    int sum, counter = 1;

    while (counter < 1000) {
        printf("Calculating...\n");
        printf("%d numbers already verified.\n", counter); 
        if ( counter % 3 == 0 || counter % 5 == 0 ) {
            sum += counter;
        }
        ++counter;  
    }

    printf("The sum of all multiples is: %d", sum);
    return 0;
}
#包括
/*查找并打印3或5的所有倍数
1000以下*/
int main(){
整数和,计数器=1;
同时(计数器<1000){
printf(“计算…\n”);
printf(“%d个数字已验证。\n”,计数器);
如果(计数器%3==0 | |计数器%5==0){
总和+=计数器;
}
++计数器;
}
printf(“所有倍数之和为:%d”,总和);
返回0;
}
爪哇:

包问题;
//打印1000以下所有3或5的倍数之和
公共类问题1{
公共静态void main(字符串[]args){
整数和=0,计数器=1;
同时(计数器<1000){
系统输出格式(“正在计算…%n”);
System.out.format(“%d个数字已验证。%n”,计数器);
如果((计数器%3==0)| |(计数器%5==0)){
总和+=计数器;
}
++计数器;
}
System.out.format(“所有倍数的总和为:%d”,总和);
}
}

C输出2919928作为总和,而Java输出233168。

代码中的问题是您没有初始化变量
sum

未初始化时,sum的值未定义。因此,sum将取当前内存中的值,这会产生类似这样的错误


将变量
sum
初始化为0,您应该会得到正确的结果。

代码中的问题是您没有初始化变量
sum

未初始化时,sum的值未定义。因此,sum将取当前内存中的值,这会产生类似这样的错误


将变量
sum
初始化为0,您应该会得到正确的结果。

在您编写的C代码中

int sum, counter = 1;
这意味着总和没有用值初始化。
与Java不同,C中int的defult值不是零。请查看问题以了解更多详细信息

这个值可能是一个垃圾值,您的代码将添加到该值,而不是零,从而给出一个无效的结果

要修复代码,只需在声明变量时初始化sum即可

 int sum = 0;
 int counter = 1; 

在您编写的C代码中

int sum, counter = 1;
这意味着总和没有用值初始化。
与Java不同,C中int的defult值不是零。请查看问题以了解更多详细信息

这个值可能是一个垃圾值,您的代码将添加到该值,而不是零,从而给出一个无效的结果

要修复代码,只需在声明变量时初始化sum即可

 int sum = 0;
 int counter = 1; 

您从未在C代码中初始化sum的值。您应该始终使用
-Wall
编译C。正确的总和确实是233168。@jwilner我的猜测是sum的值在未初始化时是未定义的。因此,sum将取内存中当前的值,这会产生类似这样的不精确性。因为在C中,未初始化的局部(堆栈)变量可以有任何随机值。因此,当您执行
sum+=counter
时,实际上是在执行
sum=+counter
@moveaway00 No,编译器不会用任何值填充堆栈。这将是对cpu周期的浪费。堆栈内存将只包含上次使用时的内存。@moveaway00操作系统不是编译器。因此,是的,操作系统确实使用初始化(零)数据设置堆栈。但不是编译器。到main运行时,堆栈已经被使用了很多次。在main之前有代码运行。您从未在C代码中初始化sum的值。您应该始终使用
-Wall
编译C。正确的总和确实是233168。@jwilner我的猜测是sum的值在未初始化时是未定义的。因此,sum将取内存中当前的值,这会产生类似这样的不精确性。因为在C中,未初始化的局部(堆栈)变量可以有任何随机值。因此,当您执行
sum+=counter
时,实际上是在执行
sum=+counter
@moveaway00 No,编译器不会用任何值填充堆栈。这将是对cpu周期的浪费。堆栈内存将只包含上次使用时的内存。@moveaway00操作系统不是编译器。因此,是的,操作系统确实使用初始化(零)数据设置堆栈。但不是编译器。到main运行时,堆栈已经被使用了很多次。main.Worked之前有代码运行。我以为它会初始化为零。现在,我将确保在初始化变量时记住这个问题。谢谢你,我的荣幸。请记住,初始化变量始终是一种很好的做法,即使必须初始化为0或NULL。好的,我会记下这一点。再次感谢你,工作顺利。我以为它会初始化为零。现在,我将确保在初始化变量时记住这个问题。谢谢你,我的荣幸。请记住,初始化变量始终是一种很好的做法,即使必须初始化为0或NULL。好的,我会记下这一点。再次感谢。