这两个C#代码片段的执行有所不同?
我正在试图弄清楚为什么goto语句如此糟糕。 谢谢。
编辑:如果我添加括号,代码片段就非常相似。
编辑2:在Visual Studio中,我点击了“转到反汇编”,然后得到了以下代码:
并且
差别在于无条件跳转。
do
{
Console.WriteLine(x.ToString());
++x;
}
while (x < 7);
并且
label:
{
Console.WriteLine(x.ToString());
++x;
}
if (x < 7) goto label;
我正在试图弄清楚为什么goto语句如此糟糕。 谢谢。
编辑:如果我添加括号,代码片段就非常相似。
编辑2:在Visual Studio中,我点击了“转到反汇编”,然后得到了以下代码:
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
的代码变得难以维护。 - Candidegoto
可能会导致代码混乱,但这并不是绝对的。我们应该理解规则而不是盲目地重复它们:http://powerfield-software.com/?p=236 - paxdiablo