int c,i;
for (int i = 1; i < 3; ++i)
{
switch (i)
{
default: c+=i;
case 2: c++;break;
case 4: c+=2;break;
}
}
printf("%d\n", c);
Pourquoi ce code est-il égal à 3 ? N'est-ce pas le cas où default: c+=i; est utilisé lorsque i vaut 1 pour la première fois, cas 2 : c++;break; est utilisé lorsque i est égal à 2 pour la deuxième fois, puis se termine, et c =2 est sorti à la fin ? Pourquoi est-ce 3 ?
Tout d’abord, clarifions quelques points à noter en switch :
1.
switch
语句体由一系列case
标签和一个可选default
标签组成。case
语句中的两个常量表达式的计算结果不能为同一个值。default
标签只能出现一次。 标记语句不是语法要求,但如果它们不存在,switch
语句是无意义的。默认语句(即default
标签)无需显示在末尾;它可以显示在 switch 语句体的任何位置。case
或default
标签只能显示在switch
au sein du communiqué.Extrait de : Documentation officielle de la déclaration Microsoft Visual Studio 2015 c++ Switch
2.
La portée de la déclaration
case
和default
本身就是标签,就是告诉编译器从满足这个标签开始向后执行,之后不会再判断其他标签的正确性,直到break
语句或者switch
mentionnée ci-dessus prend fin.Pour ce problème
ÉTAPE 1 : Lorsque
🎜ÉTAPE 4🎜 : Lorsque i=3, sortez de la bouclei=1
, cari!=2&&i!=4
, l'exécution commence après la balisedefault
This When. en exécutant l'instructionc+=i;
(nous supposons maintenant que le compilateur initialise c à 0 pour vous, vous devez savoir que tous les compilateurs ne sont pas aussi conviviaux) la valeur de c après exécution est 1 ; ÉTAPE 2i=1
时,由于i!=2&&i!=4
故从default
标签后开始执行,此时执行语句c+=i;
(我们现在就假设编译器帮你把c初始化为0,要知道并不是所有的编译器都这么友好)执行后c的值为1;STEP 2:综合上述1,2可知由于此时没有碰到任何
break
语句也没有到switch
语句的作用域结束(因为这个default
语句是放在第一个的)所以它接着向后执行case 2
后的语句(此时编译器已经不看满不满足case
标签了)此时执行语句c++
;执行后c的值为2;遇到break
语句跳出switch
语句。STEP 3:当
i=2
时,由于i满足case 2
的情况,所以直接从case 2
便签后的语句开始执行,此时执行语句c++
,执行后c的值为3,遇到break
语句跳出switch
语句。STEP 4:当i=3时,跳出
for
: Sur la base des éléments 1 et 2 ci-dessus, on peut voir que parce qu'aucune instructionbreak
n'est rencontrée à ce moment et que la portée de l'instructionswitch
n'est pas terminée (à cause de celadefault L'instruction
est placée en premier), donc elle exécute ensuite l'instruction après lecase 2
à l'envers (à ce moment, le compilateur n'a pas satisfait lecase
Label) A ce moment, l'instructionc++
est exécutée ; la valeur de c après l'exécution est 2 ; lorsque l'instructionbreak
est rencontrée, leswitch
est sautée.ÉTAPE 3 : Lorsque
i=2
, puisque i satisfait la situation ducas 2
, suivez donc directement l'instruction après lecas 2
note Démarrez l'exécution. À ce moment, l'instructionc++
est exécutée. Après l'exécution, la valeur de c est 3. Lorsque l'instructionbreak
est rencontrée, leswitch L'instruction
est sautée.for
et affichez c=3 ; 🎜🎜 (Le processus ci-dessus est la conclusion que j'ai tirée en utilisant le débogage en une seule étape de Visual Studio 2015. et en combinant les données) 🎜 🎜Quand i=1, il entre par défaut : c=1 et il n'y a pas de pause, donc continuez à faire correspondre le cas 2 et obtenez c=2 break
Quand i=2, il correspond d'abord au cas 2 et entre dans le cas 2 : c=3 break
Quand i=3 Le cycle ne tient pas.
La sortie c est 3