2017-08-22 3 views
4

breakステートメントにラベルを付けることも、ラベルを付けることもできないJavaの場合と同様に、同等の処理または同じ処理を実行するCのステートメントがありますか?Cにラベル付きまたはラベルなしのブレークがありますか?

+4

しかし、Javaにはないgotoがあります。 – rustyx

+0

あなたは 'break'ステートメントをラベルなしブレークとみなし、' goto'を拡張ラベル付きブレーキと考えることができます。 – Serge

+1

@Antony Nepgen Javaのラベル付きbreak文は、言語の作者によるプログラミングの悪いスタイルのデモンストレーションです。 –

答えて

4

いいえ、Javaのようなラベル付きのブレーク文はありません。 しかし、同様の効果を得るにはgoto文を使用することができます。ちょうどあなたが実際に終了したいループの後にラベルを宣言し、あなたはJavaでラベルされたブレークを使用しているだろうgotoを使用します。

int main() { 

    for (int i=0; i<100; i++) { 
     switch(i) { 
      case 0: printf("just started\n"); break; 
      case 10: printf("reached 10\n"); break; 
      case 20: printf("reached 20; exiting loop.\n"); goto afterForLoop; 
      case 30: printf("Will never be reached."); break; 
     } 
    } 
afterForLoop: 

    printf("first statement after for-loop."); 

    return 0; 
} 

出力:

just started 
reached 10 
reached 20; exiting loop. 
first statement after for-loop. 

注ことDijkstras有名なので、この文は多くの場合、ifまたはwhileのような制御構造よりもはるかに複雑であるため、コンピュータの科学者はコードからgoto文を禁止するために懸命に戦ってきました。だからあなたがしていることを意識して、それを賢明に使う(=まれに)。

+0

gotoのこの例は、ラベル付きのbreak/continueを使ったJava-spaghettiプログラミングよりもはるかに明確です。彼らは言語でgotoを実装することを拒否し、その後gotoよりも10倍悪いことを考え出す... – Lundin

2

いいえ、Cにそのようなものはありませんが、Javaには存在しないgotoがありますが、私は同じ方法で使用できると思われます。

それは理解するコードが必要以上に硬くなり、代わりにgotoのオプションが常にあるので、それはフロー制御にgotoを使用することが推奨されていないが、gotoが最もエレガント可能な解決策であるが、いくつかのケースがありますが、これらのケースでは、ラベル付きブレークとして使用することは除外されます。

同様の結果を達成するための良い方法は、実際にはよりクリーンで簡単です。関数を書くことです。あなたはいつでも関数からいつでも戻ることができます。これはbreakが実際に行うことと同等です。これはもちろん、機能がないのでJavaの方が複雑であり、構造体は慣用的ではありませんが、gotoを使用してをエミュレートする場合は、には改行がありません。

+0

方法はちょっとねじれているでしょう。ラベル付きブロックを破る代わりに、ブロック外のラベルにジャンプします。 @EugeneSh。 –

+0

。はい、まさにこのラベルは別の場所にあります。 –

関連する問題