同样的代码在C和Java中给出不同的答案,你能帮我吗?
这些分别用C和Java编写的代码片段应该会输出相同的结果,但它们不会,而且我无法确定错误在哪里 用C写的同样的代码在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"
#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。好的,我会记下这一点。再次感谢。