0

このプログラムをもっと読みやすくするためのアイデアが必要です。デザイナーの方が他よりも問題だと思います。

私には2つのループがあります:

for( ... ) {
  //... 
   for(...) {
     if(baa) {
       goto outer;
      } 
      //statements of 2-loop
    }
     //statements of 1-loop
}

baaゼロ以外の値がある場合はouter正常に動作し、ループ1と2の統計を実行せずにラベルにジャンプします。ただし、前に、呼び出された場合は独立returnしていくつかの呼び出しを行う必要があります。free()goto outer

 if(a != NULL) free(a);
 if(b != NULL) free(b);

しかし、私がここにいるgotoのは、上記のコードが呼び出されていないためです。

そして、私は次のことをする必要があります:

   goto outer; //if normally exited from two-loops, go to outer anyway.

    outer: {
     if(a != NULL) free(a);
     if(b != NULL) free(b);
        return ret;
    }

関数を次のようにする理由:

char* foo(void) {
  char *ret = NULL;

  for( ... ) {
    //... 
    for(...) {
     if(baa) {
        ret = tmp_result;
        goto outer;
      } 

       //some statements of 2-loop
     }
       //some statements of 1-loop
    }

  goto outer;

  outer: {
     if(a != NULL) free(a);
     if(b != NULL) free(b);
         return ret;
  }
}

これが明確であることを願っています。前もって感謝します。

4

1 に答える 1

3

outerラベルは通常の制御フローでは無視され、のターゲットとしてのみ使用されるためgoto、ループの後で必要ありません。さらに、ラベルの後のステートメントを複合ステートメントにグループ化する必要はありません。

char* foo(void) {
  char *ret = NULL;

  for( ... ) {
    //... 
    for(...) {
     if(baa) {
        ret = tmp_result;
        goto outer;
      } 

       //some statements of 2-loop
     }
       //some statements of 1-loop
    }

  outer:
     if(a != NULL) free(a);
     if(b != NULL) free(b);
     return ret;
}

まったく同じことをします(そしてIMOは目には少し良いです)。

于 2012-09-27T18:10:00.463 に答える