私はちょうどAppleのC/C++コンパイラにフロートをゼロ以外の値(約 "-0.1")に初期化しました。プリミティブ型とは何ですか?デフォルトはCで初期化されていますか?
これは大きな驚きでした。時にはたまにしか起こりませんでした(ただし、同じ関数呼び出し/ argsをあらかじめ実行していた場合は100%反復可能です)。アサーションを使用して追跡するには時間がかかりました。
フロートがゼロで初期化されていると思います。グーグルは、私がC++を考えていたことを示唆しています(もちろん、このようなことについてもっと正確です - c.f.SO:What are primitive types default-initialized to in C++?)。
しかし、おそらくAppleの言い訳は、コンパイラがCモードで動作していたということです。C:どうでしょうか?何が起こるべきか、(もっと重要なのは)典型的なことですか?
は(もちろん私はそれを手動で初期化している必要があります - しかし、私は失敗し、この一つのケースでは、私はそれが、爆破を期待していなかった - 私は通常どおり。!)
(Googleは無用より悪い証明されますこののいずれかの議論のために - 。
、現在の検索は、「C++」せずに「C」と表示することを拒否し、高度なモードで実行している場合でも、私はあまりにも愚かだ決める、とさえ私の入力を無視して保持します) ここで、実際のです発生したソースの例最初はMAXとABSの定義に問題があると思っていました(多分MAX(ABS、ABS)はいつもあなたが期待していたことをしませんでした)...しかし、アサーションとデバッガを使って掘り下げたところ、初期化 - フロートはごくまれにゼロ以外の値にinit'dなったこと):明示的な初期化子がない場合は
float crossedVectorX = ... // generates a float
float crossedVectorY = ... // generates a float
float infitesimal; // no manual init
float smallPositiveFloat = 2.0/MAX(ABS(crossedVectorX), ABS(crossedVectorY));
// NB: confirmed with debugger + assertions that smallPositiveFloat was always positive
infitesimal += smallPositiveFloat;
NSAssert(infitesimal >= 0.0, @"This is sometimes NOT TRUE");
「初期化」がどこで行われるかによって、初期化されないことがあります。 – Mat
問題を見つけたソースのコピー/ペーストを追加しました。私はそれがinit'dされていたはずだと思った? – Adam
+1すべての人がその答えを知っているほうが良いという質問をしています。 – borrrden