跳出'for'从''case"声明

本文关键字:quot 声明 case for 跳出 | 更新日期: 2023-09-27 18:09:16

我被要求做一些c#代码的维护工作,我被告知,这些代码最初是从Visual Basic 6转换过来的。(我提到这个只是因为我不懂VB6,所以我不知道它在那种语言中是否会更有意义…)

它有一个for循环,它通过在for循环中使用开关来为专有脚本语言解析一些文本…

for ( t = 0; t < upperBound(tokens); t++)
{
    String mystring = tokens[t];
    switch (mystring)  
    {
        case "GOTO":
            if (firstGoto == -1)
            {
                firstGoto = t;
            } 
            else
            {
                // compute number of tokens in GOTO
                pointLength = t - firstGoto - 1;
                break;  // exit for
            }
            break;
       case "ACTUATE"
 . . . 

注意注释

   // exit for
程序员期望break将退出for循环,但我认为它只会退出switch语句,因为break的文档说

break语句终止其出现的最近的封闭循环或switch语句。控制传递给终止语句后面的语句(如果有的话)。

那么我是否正确,这将只退出开关,但仍然在,如果是这样,什么是正确的方法来做原来的程序员想要的?

跳出'for'从''case"声明

是,break将跳出最近的循环或开关。最简单的方法是使用goto。(不,goto并不邪恶)

for {
switch(...) {
        ....
        goto MyLabel;
    }
}
MyLabel: 

是的,你是正确的…Break只会退出最里面的代码块。

一个简单的方法是在switch语句中设置一个布尔标志,在循环结束时这样做:

var flag = false;
for (...) {
    switch (...) {
        case "x":
            flag = true;
    }        
    if (flag) break;
}

是break将仅在此场景中终止交换机。如何使用布尔值退出for以及…?

for ( t = 0; t < upperBound(tokens); t++)
{
String mystring = tokens[t];
bool exitFor = false;
switch (mystring)  
{
    case "GOTO":
        if (firstGoto == -1)
        {
            firstGoto = t;
        } 
        else
        {
            // compute number of tokens in GOTO
            pointLength = t - firstGoto - 1;
            exitFor = true;
            break;  // exit for
        }
        break;
   case "ACTUATE"
. . .
if(exitFor)
    break;