5
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

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

Last updated at Posted at 2021-05-29

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文を使う人が多そう

結論

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

5
1
4

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?