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;

初期化されていない変数は、型に応じて適切なデフォルト値を取得する Java や C# などの他のプログラミング言語とは異なり、C および 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;
}

(IRでのジャンクの生成が少ないため、C IOを使用しますが、動作はストリームと同様です)

次のLLVMIRを処理します(最適化をオンにした場合)。

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 に答える