11

これが私がやりたいことです:

{
    ...
    if(condition)
        break;
    ...
}

これはループで機能します。単純なコードブロックにも似たようなものが欲しいのですが。出来ますか?
「goto」を使用する必要がありますか?


このようなステートメントの拡張は、breakC++11への便利な追加だったと思います...

4

8 に答える 8

7

どうですか

do
{
    ...
    if(condition)
        break;
    ...
}
while (0);

私はこのスタイルが特に好きではありませんが、以前に見たことがあります。リファクタリングが問題外の場合(変更すると多くのものを壊す可能性のある大規模なブロックの場合もあります)、これはオプションです。

于 2012-09-07T08:43:17.827 に答える
6

これが1つの方法です:

switch(0) {
default:
    /* code */
    if (cond) break;
    /* code */
}

(絶対にしないでください)

于 2012-09-07T09:57:37.160 に答える
5

これです:

{
    // ...

    if (!condition)
    {
        // ...
    }
}

gotoこれにより、コードのブロックから飛び出すことが回避されます。

于 2012-09-07T08:50:06.893 に答える
5

C ++ 11では、これを実現するための最良の方法は、無名ラムダ関数を使用してbreakreturn

[&](){
    ...
    if(condition)
        return;
    ...
 }();

[&]を使用しない場合は、すべての変数を参照によってキャプチャすることに注意してください。[]

于 2015-12-16T21:23:28.033 に答える
3

ここにいくつかの追加の可能性があります:

for(..)
{
    continue;//next loop iteration
}

void mymethod()
{
    ...
    return;
    ...
}

おそらく、gotoを使用し、returnを使用してコードのブロックを残したい場合は、問題のあるコードのブロックのサブメソッドを作成する必要があります。

于 2012-09-07T08:51:25.443 に答える
1

私は今、コーディングの神の怒りを解き放っているのではないかと思いますが、この素敵な厄介なマクロは、人々が以前よりも簡単にこれを行うのに役立つ可能性があります(@jleahyの回答に基づく):

//example use:
// { __breakable__
//    ...
//    if (condition)
//        break;
//    ...
//    if (condition2)
//        break;
//    ...
// }
//WARNING: use only with a standalone block. To make if, try or catch block
//         breakable use double braces
//         if (cond) {{ __breakable__ ... }}
//         try {{ __breakable__ ... }} catch (...) {{ __breakable__ ... }}
#define __breakable__ }switch(0){default:
于 2019-12-09T10:04:17.977 に答える
0

私は以下を使用して解決しました:

if (1) {
   if (1) goto End;
   ...
   ...
End:
   ;
}
于 2021-09-17T18:09:10.067 に答える
-2

「単純なコードブロックに似たものが欲しいのですが。」

return条件が満たされた後に使用returnし、呼び出し元に制御を戻します。

void MyWorkerClass::doWork(Item & workItem) {
    // ...
    if(noMoreWorkToDo)
        return;
    // ...
}
于 2015-12-19T03:26:55.260 に答える