0

私は、C++ で整数の約数を見つけるための非常に小さなプログラムに取り組んでいます。私のメイン メソッドは、int を var に変換し、int を引数として factor メソッドを呼び出します。コードは次のとおりです。

void factor(int num)
{
    for(int x = 0; x < ((num + 2) / 2); x++)
    {
        if((num % x) == 0)
        {
            cout << x << " ";
        }
    }
}

プログラムは常に factor() 内でクラッシュします。このコードを使用すると、正常に動作します。

void factor(int num)
{
    for(int x = 0; x < ((num + 2) / 2); x++)
    {
        {
            cout << x << " ";
        }
    }
}

したがって、問題はのどこかにありif((num % x) == 0)ます。その行をif((num % 2) == 0)orに変更if((num % 5) == 0)すると、正しい結果が得られます (テスト入力として 32 を使用しています)。

私は数年前にC++を学びましたが、そのほとんどを忘れていました. しかし、ループ カウンターにアクセスしようとすると、プログラムは依然としてクラッシュします。

Arch Linux 64ビットでGCC「4.9.0 20140604(プレリリース)」でCode::Blocks 13.12を使用しています。

4

4 に答える 4

7

問題は、最初のスニペットにゼロによる除算があることです。これは、標準 (n3337) によると未定義の動作です。

5.6p4 乗法演算子 [expr.mul]

二項/演算子は商を生成し、二項%演算子は最初の式を 2 番目の式で割った剰余を生成します。/orの 2 番目のオペランド%がゼロの場合、動作は未定義です。


プログラムはそのような式の値を計算できないため、クラッシュします。

if((num % x) == 0)  // num % 0 on first iteration, application will crash, or order pizza
{
  cout << x << " ";
}
于 2014-06-14T09:11:25.717 に答える
2

num%xx が 0 のとき、どうすればよいでしょうか? x が 0 のときに使用すると、プログラムがクラッシュします。

これにより、実行時エラーが発生する可能性がありますSIGFPE

于 2014-06-14T09:11:08.857 に答える
0

からループを開始してみてくださいx = 1

数値の因数を計算する場合、0 から開始しても意味がありません。演算子は除算の%余りを計算しnum/xます。0 による除算は意味がないため、演算の動作は未定義です。これは、あるコンパイラ/マシンでクラッシュする可能性があり、別のコンパイラ/マシンで何らかの結果を生成する可能性があることを意味します。

于 2014-06-14T09:20:50.920 に答える