2

jump ステートメントの分岐によるループと通常のループを記述する際の違いは何ですか。たとえば、

        main()
        {
        int i=0;
        while(i<9)
        {
          //do something
           i++;
        }

        main()
        {
            int i=0;
            label:
             //do something
              i++;
             if(i<9)
              goto label;
         }

両方の性能は同じですか?

4

3 に答える 3

10

これら 2 つのループは同等ではありません。2 番目のループは、ループではなくdo/whileループに似ていwhileます。

main() {
    int i=0;
    do {
      //do something
       i++;
    } while(i<9);
}

この 2 つは、パフォーマンスに関する限り同じである必要があります。ただし、 を使用したソリューションの読みやすさはgoto かなり損なわれるため、プロジェクトでの使用は控えます。

于 2013-06-14T12:44:33.587 に答える
2

この場合、コンパイラは同等の出力を生成する必要があります。しかし、これら 2 つの例は同等ではないと思います。while最初に条件をチェックしてから、本体を実行するかどうかを決定します。最初の例では、本文を実行してから条件をチェックします。これは、ステートメントgotoのように動作します。do while

goto可読性が低下するため、この場合は使用しないでください。gotoは限られた数のシナリオでのみ有効です。

于 2013-06-14T12:46:50.600 に答える
2

違いは、最初のものの方がはるかに読みやすいということgoto です。また、 dasblinkenlight の回答で指摘されているように、セマンティクスは同じではありません。

CPU は両方を実装するためにジャンプを行う必要があるため、パフォーマンスはほぼ同じになるはずです。もちろん、(最初のケースのように) 高レベルの意図の記述があれば、コンパイラーが何かを最適化できる可能性が高まります。

おそらくこの特定のケースではそうではありませんが、一般的には、やりたいことのより高レベルの説明が優先され、ループ構造は よりも優れていgotoます。

于 2013-06-14T12:43:35.017 に答える