解决方案 »

  1.   

    运行后的exe用Reflect看的话,代码为:
    private static void Main(string[] args)
    {
        while (true)
        {
        }
    }
    看来编译器将其弄成了while循环。不过不知道到底是个怎么理解法
      

  2.   


    这是反编译器把它弄成了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(b)应该是一个表达式吧,如a<b。其实关于for我不明白的是,圆括号里啥都没有,它是怎么进行条件判断的呢(条件成立,进入for的大括号里)?比如a是空,b也是空,它会判断成空与空相等,然后再进入for的大括号里的么?
      

  4.   


    #3楼已经说了,在汇编层面根本没有什么while语句、for语句之类的,只有基本的if、goto(jumpto)语句。而这里,编译器并不会产生if语句,只会无条件循环。
      

  5.   

    其实如果原本就是一个直接的无条件循环,而反编译工具给你生成
       while (true)
         {
         }
    这种语句,你还非要纠结于这里的条件部分一个true表达式是不是“空对空的对比”(你比原本画蛇添足的一个true还要复杂10倍),这就是比较尴尬的事情。是“只会一点高级语言”的程序员染上的一点病症,你如果学点低级的编程语言就可以治好这个病的。