2

私はコードベースで同様のperlコードを見て、これ(設定i=100)がforループから抜け出すためのOKな方法であるかどうかを知りたいと思いましたか?これに落とし穴はありますか?

int a[100];

...

bool check_if_array_contains_29()
{
    bool result = false;
    for(int i=0; i<100; ++i)
    {
        if(a[i] == 29)
        {
            result = true;
            i = 101;
        }
    }
    return result;
}

これは私がすることのようなものです。

bool check_if_array_contains_29()
{
    bool result = false;
    for(int i=0; i<100 && !result; ++i)
    {
        if(a[i] == 29)
        {
            result = true;
        }
    }
    return result;
}

編集-1:

私は機能を実現するためにperlでワンライナーを探していません。実際のコード(機能)ははるかに複雑でした。これは、私のポイント(forループの早期終了)を説明するために簡略化した単なる例です。

4

6 に答える 6

9

なぜあなたはこれをしないのですか?

bool check_if_array_contains_29()
{
    for(int i=0; i < 100; ++i)
    {
         if (a[i] == 29)
           return true;
    }
    return false;
}

編集:
複数のreturnステートメントはひどいものであり、絶対に避けるべきだと感じる人もいますが、私にとっては、提示されたような方法で複数のreturnを使用すると、コードが読みやすくなり、わかりやすくなります。

編集2:
追加のバージョン。メソッドに副作用が必要な場合や追加の操作を実行する必要がある場合は、breakステートメントを使用するか、forループの条件を調整するか、ラベルとgotoを追加できます。

bool check_if_array_contains_29_take2()
{
    bool result = false;
    for (int i=0; i < 100; ++i)
    {
        if (a[i] == 29)
        {
            result = true;
            break;
        }
    }

    // Do Other Stuff
    return result;
}

bool check_if_array_contains_29_take3()
{
    bool result = false;
    for (int i=0; !result && i < 100; ++i)
    {
        result = a[i] == 29;
    }

    // Do Other Stuff
    return result;
}

// Special edition for those who can't get enough goto
bool check_if_array_contains_29_and_do_more_stuff_without_early_return()
{
    bool result = false;
    for (int i=0; i < 100; ++i)
    {
        if (a[i] == 29)
        {
            result = true;
            break;
        }
    }

    if (!result)
        goto error;

    // Do some other stuff in the code here
    goto done;

done:
    return result;
error:
    result = false;
    goto done;
}
于 2012-06-29T18:28:31.727 に答える
4

ループの何が問題になっていますか、breakまたは単にreturn trueループ内にありますか?それは明確に意図を伝え、ループ条件に依存しません。

于 2012-06-29T18:28:11.523 に答える
3

Perlでは、おそらくラベル付きのlastを使用して、ループを早期に終了します。

配列内で最初に出現する29を見つけるには、List :: MoreUtils :: first_index@xを使用します。

 my $i = first_index { $_ == 29 } @x;
 $i > -1 or die "Cannot find 29 in array\n";

ループ変数へのばかげた割り当てに対する技術的な落とし穴は考えられませんが、これは完全なWTFであり、コードを読む人々を混乱させることはかなり重大な落とし穴です。

于 2012-06-29T18:36:23.827 に答える
2

それを行う正しい方法はbreak、CまたはlastPerlの命令を使用することです

int a[100];

...

bool check_if_array_contains_29()
{
    bool result = false;
    for(int i=0; i<100; ++i)
    {
        if(a[i] == 29)
        {
            result = true;
            break;
        }
    }
    return result;
}

最初の方法はかなり受け入れられますが。2つ目については有効ですが、もっと簡単な方法があるので使用しません。

于 2012-06-29T18:35:58.333 に答える
2

を使用するCbreakでは、最小のループ(命令が含まれるループ)を終了します。

for(...) {
    if (a[i] == 29) {
        result = true;
        break;
    }
}

しかし、あなたの場合、あなたは単にexit関数全体を使うことができます:

for(...) {
    if (a[i] == 29)
        return true;
}
于 2012-06-29T18:41:34.200 に答える
1

使用break

    bool check_if_array_contains_29()
    {
       bool result = false;
       for(int i=0; i<100; ++i)
       {   
          if(a[i] == 29)
          {
            result = true;
            break;
          }
        }
     return result;
    }
于 2012-06-29T18:36:12.767 に答える