WEB开发网
开发学院软件开发C语言 《C# to IL》第三章 选择和循环 阅读

《C# to IL》第三章 选择和循环

 2009-06-01 08:31:05 来源:WEB开发网   
核心提示: Outputhi 在编程语言中,if-else语句是极其容易理解的,《C# to IL》第三章 选择和循环(4),但是在IL中它却是相当令人困惑的,IL检查栈上的值是1还是0,我们不能创建之前已经在外部创建的变量,上面的C#程序在语法上是正确的,l 如果栈上的值是1,正如这个例子中的那样

Output

hi

在编程语言中,if-else语句是极其容易理解的,但是在IL中它却是相当令人困惑的。IL检查栈上的值是1还是0。

l 如果栈上的值是1,正如这个例子中的那样,它调用带有参数hi的WriteLine函数,并随后使用无条件跳转指令br,跳转到标号IL_001d。

l 如果栈上的值是0,代码跳转到IL_0013,并且WriteLine函数会打印出false。

从而,为了在IL中实现if-else结构,需要一个有条件跳转和一个无条件跳转。如果我们使用多个if-else语句,那么IL代码的复杂度就会动态增加。

现在,可以看出编译器的编写者的智商了。

a.cs

class zzz
{
public static void Main()
{
}
void abc( bool a)
{
if (a)
{
int i = 0;
}
if ( a)
{
int i = 3;
}
}
}

a.il

.assembly mukhi {}
.class public auto ansi zzz extends [mscorlib]System.Object
{
.field private int32 x
.method public hidebysig static void vijay() il managed
{
.entrypoint
ret
}
.method private hidebysig instance void abc(bool a) il managed
{
.locals (int32 V_0,int32 V_1)
ldarg.1
brfalse.s IL_0005
ldc.i4.0
stloc.0
IL_0005: ldarg.1
brfalse.s IL_000a
ldc.i4.3
stloc.1
IL_000a: ret
}
}

C#编程语言就更复杂了。在内部的一组括号中,我们不能创建之前已经在外部创建的变量。上面的C#程序在语法上是正确的,因为括号都是在同一级别上。

上一页  1 2 3 4 5 6 7 8 9  下一页

Tags:to IL 第三章

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接