配列上のループ
出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2020/10/02 16:40 UTC 版)
「Off-by-oneエラー」の記事における「配列上のループ」の解説
配列の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では配列の添え字をユーザが指定した数字から始めることができるが、これにより配列の添え字を問題のドメインに合わせて設定することができる。
※この「配列上のループ」の解説は、「Off-by-oneエラー」の解説の一部です。
「配列上のループ」を含む「Off-by-oneエラー」の記事については、「Off-by-oneエラー」の概要を参照ください。
- 配列上のループのページへのリンク