このコマンドについては多くの議論がありますgoto
。この問題は、その使用の正誤に関するものではなく、より単純に、実際に別のアセンブリを作成するかどうかの問題です。
私は特に Visual Studio 2013 を検討していますが、どのコンパイラの例も素晴らしいでしょう。
Bjarne Stroustrup は次のように述べています。
ラベルのスコープは、それが含まれる機能です (§6.3.4)。これは、 を使用
goto
してブロックに飛び込んだり、ブロックから飛び出したりすることができることを意味します。唯一の制限は、イニシャライザまたは例外ハンドラを飛び越えることができないことです (§13.5)。
通常のコードでの数少ない賢明な使用法の 1 つはgoto
、ネストされたループまたはswitch
ステートメントから抜け出すことです。
私の質問:goto
他の制御構造を使用して既に達成できるものとは異なるアセンブリをまだ生成するインスタンスはありますか?
たとえば、これは同一のアセンブリを生成します。
auto r = rand();
auto a = 0;
for(auto i = rand(); i > 0; --i){
switch(r){
case 1:
++sum;
goto END;
case default:
sum += rand();
break;
}
}
sum++;
END:
この非goto
コードに:
auto r = rand();
auto b = false;
auto a = 0;
for(auto i = rand(); i > 0; --i){
switch(r){
case 1:
++sum;
b = true;
break;
case default:
sum += rand();
break;
}
if(b)break;
}
if(!b)sum++;