C言語のfor文では通常 i がカウンターとされます。そのときに i をループ中で改変出来るとバグが多く発生する原因になります。また、カウンタを改変する意図がなくても行ってしまう可能性もあります。 今回はこの解決策について考えてみます。
ループ開始時にconstにする
- #include<stdio.h>
- main(){
- for(int i=0;i<10;i++){
- const auto x = i; //ループカウンターを定数として代入
- {
- const int i =0; //生のループカウンター iにアクセス出来ないようにこれで封印
- printf("%d ",x);
- }
- }
- }
6行目で const auto x=i; としています。これは i の内容を定数として x に代入しています。変化する値なのに定数というのは変ですが、ここでの意味は 変化する値 i を使いこれ以降のxを定数とすることです。
これにより x の値は変更できません。 x++ などの変更するコードを記述するとコンパイルエラーが出るのでループカウンターの値を変更するバグを防げます。
更に i も改変不可にする
これでも、直接 i を変更可能です。 今回はこれを防ぐために、ブロックを一つ追加しています。 7と10行目の括弧囲んだ部分が追加したブロックです
このブロックの中の 8 行目で const int i = 0; としています。これによりループ変数としての i にアクセスできなくなります。 さらに i++ など変更を加えようとするとエラーが出ます。 難点としては i を参照すると この場合は0が取得できるところです。
仕様として error 型でも作って 参照したら即エラーになるような型でもあれば良いのですけど。