私は数学的なバグになると思いますが、なぜそれが起こっているのか完全に理解していません。C++ if文の数学的評価のバグ
if (mNextBottomIndex < mBlocks.size() - 1) {
if (mBlocks[mNextBottomIndex + 1]->getGlobalPosition().y >= -mBlocks[mNextBottomIndex + 1]->getHeight()) {
mBlocks[mNextBottomIndex + 1]->setAlpha(1.0f);
mNextBottomIndex++;
}
}
mBlocks.size() = 0
とmNextBottomIndex = 3
(またはmNextBottomIndex
> 0任意の数に等しい)ので、それはinner if statement
の評価にクラッシュです。だから私の質問は、最後の文で変数が与えられた場合、どのようにそれがouter if statement
を過ぎていますか?アプリケーションがバックグラウンドスレッドでこれらの変数を処理していない、と変数は前と同じであり、outer if statement
後、私は
if (mBlocks.size() != 0 && mNextBottomIndex < mBlocks.size() - 1) {
if (mBlocks[mNextBottomIndex + 1]->getGlobalPosition().y >= -mBlocks[mNextBottomIndex + 1]->getHeight()) {
mBlocks[mNextBottomIndex + 1]->setAlpha(1.0f);
mNextBottomIndex++;
}
}
する外if statement
を修正し、それがクラッシュしていないようです今。
場合 'mBlocks.size()'戻り符号なしの値、 'mBlocks.size() - 1 '、' mBlocks.size()'戻ります'0'、通常_非常に大きな数(その型の最大数)にラップアラウンドします。 –
@AlgirdasPreidžiusは「通常」ではなく、*常に*です。符号なし演算がラップするように指定されています。 – Quentin
@Quentinそして、このステートメントは、以下の引用に照らして常に私を混乱させました:_式の評価中に結果が数学的に定義されていないか、またはそのタイプの表現可能な値の範囲が でない場合、 -1 'は符号なし型の表現可能な値の範囲にないため、技術的には未定義であるべきです。 –