-3

我有一个代码片段,其中 do while 语句位于 case0 的 switch 条件内,默认情况下,case 值为 case1,但它似乎正在执行 case0。程序打印的输出是6。这怎么可能,谁能解释一下这里的代码流程。提前感谢您的回答。

int main()
{
    int a = 1, t =0,n=2;
    switch(a)
    {
        case 0:
        do
        {
        t++;
        case 4:t++;
        case 3:t++;
        case 2:t++;
        case 1:t++;
        }while(--n>0);
        printf("%d",t);
        
    }
    return(0);
    
}

4

3 回答 3

2

由于一开始 a 是 1,所以 case 1 会被执行。然后满足循环条件,因此它将再次循环并执行t++;所有其他情况,直到它再次测试循环条件并中断循环。

要退出开关,请在每个案例之前使用 break 命令。

于 2021-01-18T11:20:15.650 回答
1

这在Duff 的设备中是已知的。

case大多只是标签。

于 2021-01-18T11:17:00.910 回答
1

开关盒类似于 的标签goto
您从位于case 1循环内部的 开始 - 有效地使用它作为您的起点 - 然后正常执行循环,同时在执行过程中“遍历”这些案例。

这是使用的等价物goto

int main()
{
    int a = 1, t =0,n=2;
    if (a == 0)
        goto case_0;
    if (a == 1)
        goto case_1;
    if (a == 2)
        goto case_2;
    if (a == 3)
        goto case_3;
    if (a == 4)
        goto case_4;
            
  case_0:
    do {
      t++;
  case_4:
      t++;
  case_3:
      t++;
  case_2:
      t++;
  case_1:
      t++;
    } while (--n > 0);
    
    printf("%d",t);
}

(实际生成的代码可能使用跳转表而不是一系列条件,但行为是相同的。)

于 2021-01-18T11:33:46.360 回答