switch优缺点c语言,关于switch解决方法

当前位置:我的异常网» 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。

文章评论

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值