c - Switch 语句 - 换行和正确缩进后的行

标签 c switch-statement

    int i,j=0;
    for(i=0;i<N;i++){
       switch(i){
          case 0:
          case 1: if(i<1) break; i=123;
          case 456: j=666; break;
          default: j=777;
       }
       if(j==666) break;
    }
    printf("%i %i\n",i,j);

我想问一下在这种情况下 switch 语句的正确缩进。据我了解,

    case 0:
    case 1: if(i<1) break; i=123;

相当于

    case 0: case 1:{
       if(i<1){
          break;
       }
       i=123;
    } 

但是,我不明白 i=123 中 break 之后的 case 1 。我也尝试过使用不同的 N 值,发现只要 N>=2 我总是会得到 的输出

123 666

但我没有看到 i 的值如何到达 456 以便触发 case 456

最佳答案

我们将格式化代码以使其更具可读性,并在解释中添加注释:

int i, j = 0;

for(i = 0; i < N; i++){
   switch (i) {
      case 0:
      case 1:           // Take this case if i is 0 or 1
          if (i < 1)
              break;    // if i < 1 (in other words, it's 0), then break out of switch
          i = 123;      // if i wasn't < 1, then set i to 123 AND fall through to next case
      case 456:         // take this case if i is (originally) 456
                        //    (prior statement still falls through here!)
          j = 666;      // this will happen if either i was 456, or if i was 1
                        //    and then set to 123
          break;
      default:
          j = 777;
   }

   if (j == 666)
       break;    // break out of for loop if i is 666
}

printf("%i %i\n", i, j);

if 子句中的单个语句周围添加一个 block 不会改变它的行为。所以在这种情况下,这:

if (i < 1)
    break;

具有与此相同的行为:

if (i < 1) {
    break;
}

break 不适用于 if block 。它仍然适用于外部 switch

简单地说,开关 只是为i 的值创建一个跳转表。开关盒内的 break 将退出开关的“底部”。如果您到达 case 的末尾并且没有中断,则代码将继续执行到下一个 casedefault(如果有)一个。

关于c - Switch 语句 - 换行和正确缩进后的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43640944/

相关文章:

c++ - 不断结合优化编译器

PHP5 - OOP - 多态性 - 帮我重写这个简单的开关

ios - 根据模式/大小写更改 navigationBar.title?

swift - 使用 'case'模式匹配直接返回结果

javascript - 在 JavaScript 中同时中断 for 循环和 switch-case

检查当前用户是否可以写入注册表(C,windows)

c++ - 将数值绑定(bind)到准备好的 SQL 的正确方法

C支持基础类吗?

c++ - 函数中的多个返回值

java - 交换机不兼容类型错误