いくつかの本は、for、while、doループを正しく書く方法を教えてくれます。多くのオンライン記事がそれらを互いに比較しています。
しかし、私は私に何をしてはいけないかを教えてくれる場所を見つけていません。たとえば、ループ内のカウンターまたは条件変数の値を変更すると、問題が発生しますか?
機械に依存しない答えをお願いします。
いくつかの本は、for、while、doループを正しく書く方法を教えてくれます。多くのオンライン記事がそれらを互いに比較しています。
しかし、私は私に何をしてはいけないかを教えてくれる場所を見つけていません。たとえば、ループ内のカウンターまたは条件変数の値を変更すると、問題が発生しますか?
機械に依存しない答えをお願いします。
はい、ループ内でカウンターを変更できます。これは非常に役立つ場合があります。たとえば、コマンド ライン引数の解析では、オプション フラグの後に値が続きます。この例を以下に示します。
次のコマンドを入力します。
program -f filename -o option -p another_option
コード:
#include <string.h>
int main(int argc, char** argv)
{
char *filename, *option, *another_option;
if(argc > 1){
for(int i=1; i<argc; i++){
if(strcmp(argv[i],"-f")==0){
filename = argv[++i];
} else if(strcmp(argv[i],"-o")==0){
option = argv[++i];
} else if(strcmp(argv[i],"-p")==0){
another_option = argv[++i];
} else {
printf("Option \"%s\" not recognized, skipping\n",argv[i]);
continue;
}
}
} /* end if argc > 1 */
return 0;
}
サンプル プログラムは、正しいコマンド ライン文字列にアクセスするために、カウンターを自動的にインクリメントします。もちろんカウンタなどを組み込む方法はありますが、この場合はコードが煩雑になるだけです。
他の人が指摘したように、これは多くの人がバグを書く場所であり、ループ内でカウンターをインクリメントするとき、特にループがカウンター値を条件としている場合は注意が必要です。
Cのループ内でループカウンターを変更することは無効ではありません。
しかし、それはおそらく将来の読者を混乱させるでしょう、そしてそれはそれをしない正当な理由です。
それはあなたが「物事をねじ込む」とはどういう意味かによります。
自分が何をしているのかがわかっている場合は、カウンターを変更できます。言語にはこれに関する制限はありません。
ループ内のカウンター変数を変更することは許可されていますが、変更すべきでないときに変数を減らして無限ループを作成しないようにするために何をしているのかを知っておくように注意してください。
一部のアルゴリズムは実際にこれから恩恵を受けますが、もちろんこれを行うとコードが読みにくくなるため、実行していることにもコメントするようにしてください。
はい、カウンター変数と条件変数を変更できます。それらは、ループの次の反復で評価されます。
確かにできますが、ループを乱さないように注意してください。do...while と while では、ループ内の conter の変更が頻繁に発生します。
do{
counter++;
some expressions;
}
while(counter < SOMEVALUE);
はい、C / C ++ / C#ではループ内のカウンターなどを変更できます。
他の多くのテクニックと同様に、何をするかを知っていれば問題ありません。
たとえば、次のコード:
int i;
for (i=0;i<5;i++)
printf("%d\n",i--);
は無限ループですが、このバージョンのバブル ソート:
int *arr,n;
//allocate memory, assign values, and store the length of the array in n
int i;
for (i=0;i<n-1;i++)
if (arr[i]>arr[i+1]) {
int temp=arr[i];
arr[i]=arr[i+1];
arr[i+1]=temp;
if (i) i-=2;
}
結構です。(正確にはバブル ソートではありません。ネストされたループを使用する代わりに、メンバーを交換した後に配列に戻ります)