这是反编译器把它弄成了while循环,而不是编译器。编译器就是转换为跳转指令而已。IL层面没有循环语句这一说。 ;代表语句结束,这里是一句空语句,编译器不会为它产生任何代码,所以 ; ;; ;;; ... 都是一样的for循环本身就是和while等价的。 for (a;b;c) d; 也可以写成 a; while (b) { d; c; }但是反编译工具稍微有些智能,它会猜测你的源代码是写的for还是while 但是如果你写 for (;;),这个它就猜错了。 类似的,你写 int i = 0; while (i < 10) i++; 这个它也会猜错,猜成 for (int i = 0; i < 10; i++);
private static void Main(string[] args)
{
while (true)
{
}
}
看来编译器将其弄成了while循环。不过不知道到底是个怎么理解法
这是反编译器把它弄成了while循环,而不是编译器。编译器就是转换为跳转指令而已。IL层面没有循环语句这一说。
;代表语句结束,这里是一句空语句,编译器不会为它产生任何代码,所以
;
;;
;;;
...
都是一样的for循环本身就是和while等价的。
for (a;b;c) d;
也可以写成
a;
while (b) { d; c; }但是反编译工具稍微有些智能,它会猜测你的源代码是写的for还是while
但是如果你写 for (;;),这个它就猜错了。
类似的,你写
int i = 0;
while (i < 10)
i++;
这个它也会猜错,猜成
for (int i = 0; i < 10; i++);
#3楼已经说了,在汇编层面根本没有什么while语句、for语句之类的,只有基本的if、goto(jumpto)语句。而这里,编译器并不会产生if语句,只会无条件循环。
while (true)
{
}
这种语句,你还非要纠结于这里的条件部分一个true表达式是不是“空对空的对比”(你比原本画蛇添足的一个true还要复杂10倍),这就是比较尴尬的事情。是“只会一点高级语言”的程序员染上的一点病症,你如果学点低级的编程语言就可以治好这个病的。