例えば:
array[2]={1,2};
myInt=5;
if (array[myInt-6]==2)
cout << true << endl;
else
cout << false << endl;
ifステートメントの配列で参照されている値が明らかに範囲外です。これをコンパイルして実行すると、条件が真ではないので意味のあるfalseが出力されますが、なぜエラーが出力されないのか疑問に思います。
例えば:
array[2]={1,2};
myInt=5;
if (array[myInt-6]==2)
cout << true << endl;
else
cout << false << endl;
ifステートメントの配列で参照されている値が明らかに範囲外です。これをコンパイルして実行すると、条件が真ではないので意味のあるfalseが出力されますが、なぜエラーが出力されないのか疑問に思います。
未定義の動作は未定義であるため。動作しているように見えることを含め、何でも起こり得ます。
コンパイラーやランタイムの診断は必要ありません。境界チェックは自分で行う必要があります。
C ++はメモリセーフな言語ではないため、コンパイラやランタイムではなく、このような問題を回避するのはあなたの仕事です。
次の問題。
呼び出しarray[-1]
はエラーではありません。*(array - 1)
つまり、配列の1int前のアドレスの値の省略形です。OSがこのアドレスをプログラムに割り当てたとすると、intにキャストされたデータのランダムなビットを取得するだけです。
その場所に保存されているデータは毎回同じである可能性が高いため、同じ動作が得られます。それはあまり意味がありません。このようなことを強制してエラーを発生させたい場合は、標準テンプレートライブラリのコンテナの1つ(ベクトルなど)を使用するのがおそらく最も簡単です。