切换语句 - 中断后的行和适当的缩进

时间:2017-04-26 17:32:24

标签: c switch-statement

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

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

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

相当于

i=123

但是,在case 1中断后我无法理解N。我也试过玩不同的N>=2值,发现只要i我就会得到

的输出
  

123 666

但我不知道456的价值如何到case 456才能触发/** * @Route("/c/{categoryName}.{extension}", * name="category", * schemes="http", * requirements={"categoryName"=".+", "extension"="\w{3,5}"}) * @Route("/c/{categoryName}", * name="format_category", * schemes="http", * requirements={"categoryName"=".+"}) * */

4 个答案:

答案 0 :(得分:0)

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

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子句中的单个语句周围添加一个块不会改变它的行为。所以在这种情况下,这个:

if (i < 1)
    break;

具有与此相同的行为:

if (i < 1) {
    break;
}

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

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

答案 1 :(得分:0)

我相信你对“缩进”与案例陈述的“预期分离”感到困惑。

case语句基本上只是标签。除非通过break声明分开,否则它们将作为落后模型。

因此,在您的情况下,i不需要456来“触发”case 456:及相关陈述。值1将具有相同的效果。

  

但是,在i=123中断后我无法理解case 1

嗯,这是一个条件break语句。在if值为i0的情况下,1条件都会被点击。如果i的值为0,则条件检查将成功,它将突破switch语句。否则,它将继续,并将执行赋值语句。

因此,只要N(其他循环条件)为>=1i将设置为123j将设置为666 }}

  

...但我看不到i的价值如何到456才能触发case 456

它不需要,这是一种堕落行为。

关于“缩进”部分的实际重要性,好吧,编译器不关心缩进,我们,人类。适当的缩进使代码可读和可维护,从而使它们具有价值。

答案 2 :(得分:0)

让我们更正确地格式化这段代码:

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);

i为1时,if (i<1)条件的计算结果为false。因此,break不会运行,并且if之后的语句(即i=123)将被执行。然后它会落到case 456,将j设置为666并突破switch。此时它达到if (j==666),其评估为真,并突破for

答案 3 :(得分:0)

我简化了您的代码,以解释switch的工作原理。

#include <stdio.h>

int main(){
    int i;
    int N=5;

    for(i=0;i<N;i++){
       printf("i: %d\n",i);
       switch(i){
       case 0:
       case 1: 
          if(i<1){
             printf("in case 1 in if when case: 0 \n"); 
             break;
          } 
          else{   
            printf("in case 1 after if --> in else\n");
          }
       case 3: 
          printf("in case 3\n");
          break;
       default: 
          printf("default : ");
          printf("i: %d\n",i);
       }

       if(i==4){
            printf("after switch\n");
            break;
       }
    }

    printf("after for\n");

    return 0;
}

节目输出:https://i.stack.imgur.com/pDJVo.png

执行switch时,只需在case 0块中,程序控制即可进入 case 1因为你没有输入任何表达。