69,371
社区成员
发帖
与我相关
我的任务
分享
46: int i=1;
00401048 mov dword ptr [ebp-4],1
47: int j=0;
0040104F mov dword ptr [ebp-8],0
48: switch(i)//注意这里,整个switch只有在这里进行同一判断,然后直接跳转.
49: {//这里有一大堆东西,具体意思不需要知道(毕竟现在不是在学汇编)
00401056 mov eax,dword ptr [ebp-4]//只需要知道,整个switch里面所有case都是通过这堆代码
00401059 mov dword ptr [ebp-0Ch],eax//进行跳转,就足够了.
0040105C mov ecx,dword ptr [ebp-0Ch]
0040105F sub ecx,1
00401062 mov dword ptr [ebp-0Ch],ecx
00401065 cmp dword ptr [ebp-0Ch],3
00401069 ja $L7455+7 (00401095)
0040106B mov edx,dword ptr [ebp-0Ch]
0040106E jmp dword ptr [edx*4+4010A3h]
50: case 1://在随后的这些case里面,实际上不需要在进行判断. 所以,这些case实际上只是一个标号的作用.
51: j=1;//目的是为了在第一个case之前计算好每一个case需要跳转的地址.
00401075 mov dword ptr [ebp-8],1
52: break;//遇到 break 就直接跳转到 switch(){}大括号后面
0040107C jmp $L7455+0Eh (0040109c)
53: case 2:
54: j=2;
0040107E mov dword ptr [ebp-8],2
55: break;
00401085 jmp $L7455+0Eh (0040109c)
56: case 3:
57: j=3;//没有break的情况,就不会跳转出去,所以,程序就会继续执行,直到遇到break,或者
00401087 mov dword ptr [ebp-8],3//执行到switch(){}大括号后面为止
58: case 4:
59: j=4;
0040108E mov dword ptr [ebp-8],4
60: default:
61: j=5;
00401095 mov dword ptr [ebp-8],5
62: break;
63: }
//执行流程也该清楚了吧?
switch(x){
int a = 2;
case 1:printf("1");
break;
case 2:printf("2");
break;
}
在这个语句中int a = 2将不会被执行,如何在case中使用了变量a,是会报错的。
switch(x){
case 1:printf("1");
case 2:printf("2");
}
将显示两个数
switch(x){
case 1:case 2:
printf("1 or 2");
case 3:case 4:
printf("3 or 4");
}
#include <stdio.h>
int main()
{
char x = 'B';
switch (x){
case 'A':printf("A");
case 'B':printf("B");
case 'C':printf("C");
default: printf("D");
}
}
result: BCD
case后面的常量表达式实际上只起语句标号作用,而不起条件判断作用,即"只是开始执行处的入口标号". 因此,一旦与switch后面圆括号中表达式的值匹配,就从此标号处开始执行,而且执行完一个case后面的语句后,若没遇到break语句,就自动进入 下一个case继续执行,而不在判断是否与之匹配,直到遇到break语句才停止执行,退出break语句.因此,若想执行一个case分之后立即跳出 switch语句,就必须在此分支的最后添加一个break语句.