为什么不长期100%准确?

时间:2012-10-01 05:48:00

标签: c++ linux long-integer

我在Linux上尝试使用time -p命令,并编写了一些代码来浪费CPU周期:

#include <iostream>

using namespace std;

int main() {
 long int c;

 long int ss;

 for(c = 0;c < 10000000;c++) {
  ss += c*c;
 }

 cout<<ss<<endl;

 return 0;
}

但是在运行几次之后我发现了一些有趣的东西,但是:

me@octopus:~/Desktop> ./test
1292030741067648912
me@octopus:~/Desktop> ./test
1292030742538841328
me@octopus:~/Desktop> ./test
1292030742228685600
me@octopus:~/Desktop> ./test
1292030740402651312
me@octopus:~/Desktop> ./test
1292030740207543344
me@octopus:~/Desktop> ./test
1292030740346553856
me@octopus:~/Desktop> ./test
1292030741629275040
me@octopus:~/Desktop> ./test
1292030740397307072
me@octopus:~/Desktop> ./test
1292030742928964784
me@octopus:~/Desktop> ./test
1292030741780094096

我不仅每次都没有获得相同的数字,正如我所料,我甚至没有得到相同的数字。这是怎么回事?

5 个答案:

答案 0 :(得分:10)

您尚未将ss初始化为零,因此其初始值未定义。你需要:

long int ss = 0;

答案 1 :(得分:5)

您尚未初始化ss。初始值可以是任何值。

long int ss = 0;

答案 2 :(得分:3)

您必须初始化ss,否则会产生无法预测的结果。

long int ss = 0;

未初始化的变量在C和C ++中具有未确定的值,与Java和C#等其他编程语言不同,它们根据类型获得正确的默认值。因此,请注意C / C ++。

答案 3 :(得分:2)

ss += c*c;

总是不同的,因为在循环的第一次迭代中,ss总是随机的。

您必须先将其初始化为0才能按预期工作。

答案 4 :(得分:1)

听听编译器的说法很有意思:

#include <cstdio>

int main() {
  long int ss;

  for(long int c = 0; c < 10000000; c++) {
    ss += c*c;
  }

  printf("%ld", ss);

  return 0;
}

(我使用C IO,因为它在IR中产生较少的垃圾,但行为与流类似)

检索以下LLVM IR(已启用优化):

define i32 @main() nounwind uwtable {
  %1 = tail call i32 (i8*, ...)* @printf(c"%ld\00", i64 undef)
  ret i32 0
}

我相信undef能说明问题。