goto文は使ってもいいんじゃないかと思い始めてきた話

atcoder.jp

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文がよいのでは?

C++ - ラムダ式を流用して多重ループから抜ける。有り?無し?|teratail

色んなとこで議論がなされているけどgoto文を使う人が多そう

結論

自分が納得しているものを使うのが一番!!!!!!