0

returnステートメントについて、(自分自身にとって) 何か新しいことを発見しました。と組み合わせてforifデバッガーが関数から制御を返さずに次のステートメントに進むように強制します。代わりに、関数内でスタックし、for条件が真でなくなるまで繰り返します。例えば:

struct Position
{
    int position;
    int value;
};

vector<Position> find_all(vector<Position>& v, int value)
{
    vector<Position> res;
    for (auto p = v.begin(); p != v.end(); ++p)
        if (p->value == value)
            res.push_back(*p);

    return res;
}

int main()
{
    vector<Position> v { { 0, 0 }, { 1, 1 }, { 2, 0 }, { 3, 3 },
                         { 4, 4 }, { 5, 6 }, { 6, 0 }, { 7, 2 } };
    find_all(v, 0); 
    cin.get();
    return 0;
}

デバッガーを に設定してreturn res;コードのデバッグを開始すると、このメソッドにステップインすると、関数は for ループが終了するまで関数内で実行され続け、代わりに戻ります。ifステートメントで中括弧を設定すると、return は正常に機能します。

理解できません 何が起こったのか、なぜなのか誰か説明してください。私は使用していますが、Stroustrup book でVisualC++このタイプの使用法を見つけました。return

4

1 に答える 1

5

これは、ソース レベルのデバッガーがマシン コードの実行をソース コードまで追跡しようとしている兆候です。forループには、実際p != v.end()にはwhile条件であり、反復ごとに評価される条件があります。この条件の評価は通常、ループの最後に行われます (少なくとも MSVC では)。あなたの例では、ループの最後にコードがないため、デバッガーは「現在の行」をループの後のステートメント、つまり行として表示しますreturn res;

ループ本体を中かっこで囲み、閉じ中かっこをfor新しい行に置くと、デバッガーには条件に関連付けるコード行が表示され、予期される動作が表示されます。

vector<Position> find_all(vector<Position>& v, int value)
{
    vector<Position> res;
    for (auto p = v.begin(); p != v.end(); ++p)
    {
        if (p->value == value)
            res.push_back(*p);
    }

    return res;
}

デバッガーは現在の行の概算を表示することに注意してください。デバッグモードでは、これは通常かなり正確ですが、このように「奇妙に見える」場合があります。最適化を行ってリリース ビルドをステップ実行しようとすると、「現在の行」が飛び回っているように見えることに気付くでしょう。

于 2013-07-27T13:07:45.373 に答える