0

我在 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

正如我所料,我不仅每次都没有得到相同的号码,甚至一次都没有得到相同的号码。这里发生了什么?

4

5 回答 5

10

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

long int ss = 0;
于 2012-10-01T05:50:45.453 回答
5

你还没有初始化ss。初始值可以是任何东西。

long int ss = 0;
于 2012-10-01T05:50:09.727 回答
3

你必须初始化ss,否则你会得到不可预知的结果。

long int ss = 0;

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

于 2012-10-01T05:51:31.477 回答
2
ss += c*c;

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

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

于 2012-10-01T05:52:32.850 回答
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言自明。

于 2012-10-01T08:00:07.927 回答