关于这个命令有很多争论goto
,这个问题不是关于它使用的对错,而是更简单的问题是它是否真的创建了不同的程序集。
我特别关注 Visual Studio 2013,但任何编译器中的示例都会很棒。
标签的范围是它所在的功能(第 6.3.4 节)。这意味着您可以使用
goto
跳进和跳出块。唯一的限制是您不能跳过初始化程序或异常处理程序(第 13.5 节)。
在普通代码中为数不多的合理用途之一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++;