加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – GOTO与DO WHILE差异

发布时间:2020-12-15 23:46:32 所属栏目:百科 来源:网络整理
导读:以下2个C#片段之间的执行存在差异吗? do{ Console.WriteLine(x.ToString()); ++x;} while (x 7); 和 label:{ Console.WriteLine(x.ToString()); ++x;}if (x 7) goto label; 我想弄清楚为什么这么糟糕. 谢谢. 编辑:如果我添加括号,片段非常相似. EDIT2:在V
以下2个C#片段之间的执行存在差异吗?

do
{
    Console.WriteLine(x.ToString());
    ++x;
} 
while (x < 7);

label:
{
    Console.WriteLine(x.ToString());
    ++x;
}
if (x < 7) goto label;

我想弄清楚为什么这么糟糕.
谢谢.

编辑:如果我添加括号,片段非常相似.

EDIT2:在Visual Studio中,我点击了Go to Disassembly,我得到以下代码:

do
            {
00000037  nop 
                Console.WriteLine(x.ToString());
00000038  lea         ecx,[ebp-40h] 
0000003b  call        63129C98 
00000040  mov         dword ptr [ebp-48h],eax 
00000043  mov         ecx,dword ptr [ebp-48h] 
00000046  call        63148168 
0000004b  nop 
                ++x;
0000004c  inc         dword ptr [ebp-40h] 
            } 
0000004f  nop 
            while (x < 7);
00000050  cmp         dword ptr [ebp-40h],7 
00000054  setl        al 
00000057  movzx       eax,al 
0000005a  mov         dword ptr [ebp-44h],eax 
0000005d  cmp         dword ptr [ebp-44h],0 
00000061  jne         00000037

label:
            {
                Console.WriteLine(x.ToString());
00000069  lea         ecx,[ebp-40h] 
0000006c  call        63129C98 
00000071  mov         dword ptr [ebp-4Ch],eax 
00000074  mov         ecx,dword ptr [ebp-4Ch] 
00000077  call        63148168 
0000007c  nop 
                ++x;
0000007d  inc         dword ptr [ebp-40h] 
            }
00000080  nop 
            if (x < 7) goto label;
00000081  cmp         dword ptr [ebp-40h],7 
00000085  setge       al 
00000088  movzx       eax,al 
0000008b  mov         dword ptr [ebp-44h],eax 
0000008e  cmp         dword ptr [ebp-44h],0 
00000092  jne         00000097 
00000094  nop 
00000095  jmp         00000068

区别在于无条件跳跃.

解决方法

不,我甚至认为有一段时间在后面实施.

使用goto的不好之处在于它鼓励在代码中来回传递(也称为“意大利面条代码”:它是一团糟).它使您的代码极难阅读,调试和分析,并且它引入了错误,因为您无法真正理解正在发生的事情.

与之相关的好处是,您可以理解它,并且编译器可以理解它,因此它可以为您提供很好的警告.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读