|
Off-by-oneエラー(オフ-バイ-ワンエラー、off-by-one error、OBOE)とは、境界条件の判定に関するエラーの一種である。コンピュータプログラミングにおいて、ループが正しい回数より一回多く、または一回少なく実行された場合などに発生する。 この問題の代表的な原因として、プログラマーが数字のカウントを0からではなく1から開始してしまう(多くのプログラミング言語では配列の添え字は0から始まる)、数値の比較において「~未満」とすべきところを「~以下」としてしまう、等が挙げられる。また、数学的な処理を行っている場合にも発生しうる。 == 配列上のループ == 配列の''m''番目の要素から''n''番目までの要素を処理する場合を考える。処理対象の要素はいくつだろうか?この場合、直感的に考えると''n-m''個となるが、実際には1個異なり、''n-m+1''個が正しい。これは「植え木算エラー」の一種である。 上記のような理由により、コンピュータ上で数の範囲を表現する場合にはしばしば半開区間が用いられる。''m''と''n''を含む区間は、植木算エラーを避けるために''m''を含み''n+1''を含まない区間として表現される。例えば、5回繰り返して実行されるループは0から5までの左閉半開区間を用いて以下のように表現される。 for (i = 0; i < 5; i++) ループ中の処理は最初iが0の状態で開始される。以降、iは1, 2, 3と増加し、4までは問題なく実行される。次の時点でiは5となり、条件文i < 5が偽と判定されてループは終了する。 もし、条件文で使用されている比較演算子が<=(「~未満」ではなく「~以下」)だった場合、ループの中の処理は6回実行されてしまう。つまり、iは0, 1, 2, 3, 4, 5と増加し、5まで実行される。同様に、iが0でなく1で初期化されていた場合にはループは4回しか実行されない。つまり、iは1, 2, 3と増加し、4まで実行される。これらのケースはどちらもoff-by-oneエラーの一種である。 このようなエラーが発生する他の例としては、while文を使用すべきところでdo-while文を使用した場合(逆も同じ)が挙げられる。do-whileループは必ず1回は実行される。 配列関連の勘違いはプログラミング言語ごとの差異に由来する場合もある。配列の添え字は0から始まる場合が一般的だが、1から始まる言語もいくつかある。Pascalでは配列の添え字をユーザが指定した数字から始めることができるが、これにより配列の添え字を問題のドメインに合わせて設定することができる。 抄文引用元・出典: フリー百科事典『 ウィキペディア(Wikipedia)』 ■ウィキペディアで「Off-by-oneエラー」の詳細全文を読む スポンサード リンク
|