goto文は多重ループから抜け出す場合は使用することを推奨されている
でもほんとにgoto文を使ってもいいのか?とおもって多重ループを抜け出すときの別の案を考えてみた
条件を満たしたらたくさんbreak
int n=10;
bool flg=false;
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
for(int k=0;k<n;k++){
if(i+j+k==n){
cout<<i<<" "<<j<<" "<<k<<endl;
flg=true;
}
if(flg) break;
}
if(flg) break;
}
うーん、微妙な気がする
breakを書く手間とそのための変数を追加するのがもったいない
ラムダ式の形にまとめる
int n=10;
[&]{
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
for(int k=0;k<n;k++){
if(i+j+k==n){
cout<<i<<" "<<j<<" "<<k<<endl;
return;
}
}
}
}();
これ始めて知った時はなるほど~ってなったけど階層が一段深くなるのが若干悩ましい気もする
ただ、breakに比べたらこちらの方が良い
やっぱりgoto
int n=10;
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
for(int k=0;k<n;k++){
if(i+j+k==n){
cout<<i<<" "<<j<<" "<<k<<endl;
goto EXIT_MULTI_LOOP;
}
}
}
EXIT_MULTI_LOOP:
追加するのが2行だけで、脳死で追加できるのでやっぱりgoto文がよいのでは?
関数にまとめる
void imi_no_aru_namae_func() {
int n=10;
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
for(int k=0;k<n;k++){
if(i+j+k==n){
cout<<i<<" "<<j<<" "<<k<<endl;
return;
}
}
}
}
shiracamus さんにコメントをいただいて追記しました
関数にまとめると
- 処理の内容を関数名で要約できる
- 24行以内に収めると1画面で処理だけを見ることができる
などの良い点があるので関数化も良い手段であると思います
色んなとこで議論がなされているけどgoto文を使う人が多そう
結論
自分が納得しているものを使うのが一番!!!!!!