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"=".+"})
*
*/
。
答案 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
的末尾并且没有中断,则代码将继续执行下一个case
或default
(如果有)。
答案 1 :(得分:0)
我相信你对“缩进”与案例陈述的“预期分离”感到困惑。
case
语句基本上只是标签。除非通过break
声明分开,否则它们将作为落后模型。
因此,在您的情况下,i
不需要456
来“触发”case 456:
及相关陈述。值1
将具有相同的效果。
但是,在
i=123
中断后我无法理解case 1
。
嗯,这是一个条件break
语句。在if
值为i
或0
的情况下,1
条件都会被点击。如果i
的值为0
,则条件检查将成功,它将突破switch
语句。否则,它将继续,并将执行赋值语句。
因此,只要N
(其他循环条件)为>=1
,i
将设置为123
而j
将设置为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
因为你没有输入任何表达。