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的不好之处在于它鼓励在代码中来回传递(也称为“意大利面条代码”:它是一团糟).它使您的代码极难阅读,调试和分析,并且它引入了错误,因为您无法真正理解正在发生的事情. 与之相关的好处是,您可以理解它,并且编译器可以理解它,因此它可以为您提供很好的警告. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |