当前位置:我的异常网» C语言 » 关于switch解决方法
关于switch解决方法
www.myexceptions.net 网友分享于:2013-05-02 浏览:8次
关于switch
#include
void main()
{
int i;
scanf("%d",&i);//输入3,求结果的解释
switch(i)
{
int j=1,k=2;
case 1:
printf("1\n");
break;
case 2:
printf("2\n");
break;
default:
printf("%d %d\n",j,k);
}
}
------解决方案--------------------
void main()
{
00413300 push ebp
00413301 mov ebp,esp
00413303 sub esp,100h
00413309 push ebx
0041330A push esi
0041330B push edi
0041330C lea edi,[ebp-100h]
00413312 mov ecx,40h
00413317 mov eax,0CCCCCCCCh
0041331C rep stos dword ptr es:[edi]
int i;
scanf("%d",&i);//输入3,求结果的解释
0041331E mov esi,esp
00413320 lea eax,[i]
00413323 push eax
00413324 push offset string "%d" (4157ACh)
00413329 call dword ptr [MSVCR100D_NULL_THUNK_DATA (4182ACh)]
0041332F add esp,8
00413332 cmp esi,esp
00413334 call @ILT+435(__RTC_CheckEsp) (4111B8h)
switch(i)
00413339 mov eax,dword ptr [i]
0041333C mov dword ptr [ebp-100h],eax
00413342 cmp dword ptr [ebp-100h],1
00413349 je main+80h (413380h)
0041334B cmp dword ptr [ebp-100h],2
00413352 je main+99h (413399h)
00413354 jmp main+0B2h (4133B2h)
00413356 mov byte ptr [ebp-0F5h],0
0041335D mov byte ptr [ebp-0E9h],0
{
int j=1,k=2;
00413364 mov byte ptr [ebp-0E9h],1
0041336B mov dword ptr [j],1
00413372 mov byte ptr [ebp-0F5h],1
00413379 mov dword ptr [k],2
case 1:
printf("1\n");
00413380 mov esi,esp
00413382 push offset string "1\n" (4157A8h)
00413387 call dword ptr [__imp__printf (4182B0h)]
0041338D add esp,4
00413390 cmp esi,esp
00413392 call @ILT+435(__RTC_CheckEsp) (4111B8h)
break;
00413397 jmp main+0FDh (4133FDh)
case 2:
printf("2\n");
00413399 mov esi,esp
0041339B push offset string "2\n" (41573Ch)
004133A0 call dword ptr [__imp__printf (4182B0h)]
004133A6 add esp,4
004133A9 cmp esi,esp
004133AB call @ILT+435(__RTC_CheckEsp) (4111B8h)
break;
004133B0 jmp main+0FDh (4133FDh)
default:
printf("%d %d\n",j,k);
004133B2 cmp byte ptr [ebp-0F5h],0
004133B9 jne main+0C8h (4133C8h)
004133BB push offset (41343Ch)
004133C0 call @ILT+145(__RTC_UninitUse) (411096h)
004133C5 add esp,4
004133C8 cmp byte ptr [ebp-0E9h],0
004133CF jne main+0DEh (4133DEh)
004133D1 push offset (41343Ah)
004133D6 call @ILT+145(__RTC_UninitUse) (411096h)
004133DB add esp,4
004133DE mov esi,esp
004133E0 mov eax,dword ptr [k]
004133E3 push eax
004133E4 mov ecx,dword ptr [j]
004133E7 push ecx
004133E8 push offset string "%d %d\n" (4157A0h)
004133ED call dword ptr [__imp__printf (4182B0h)]
004133F3 add esp,0Ch
004133F6 cmp esi,esp
004133F8 call @ILT+435(__RTC_CheckEsp) (4111B8h)
}
}
lz:不知道你在什么环境编译的,这是我的结果(vs2010环境下)。
也就是说,我的编译器(vs2010自带)是编译了int j=1,k=2。为什么运行时又有错呢?
我认为是编译器的问题,我的编译器编译了这两条语句,且同下面的printf("%d %d\n",j,k)处在同一队{}中,则编译器认为,j,k已定义,所以编译通过。
而实际运行时却是在00413354 jmp main+0B2h (4133B2h)语句就跳到printf了,这时候j,k变量并未赋值,则在我的环境中他们的值是(cc cc cc cc cc cc cc cc)即:-858993460。
文章评论