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
我总是会得到 p> 的输出
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
的末尾并且没有中断,则代码将继续执行到下一个 case
或 default
(如果有)一个。
关于c - Switch 语句 - 换行和正确缩进后的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43640944/