if()
{
}
else
{
if()
{
}
else
{
}}
if(){}
else if(){}
else if(){}

解决方案 »

  1.   

    你这两个比较的东西,好像不是同一个类型的,因为你第二个判断里面,其实没包括全部分支,
    应该改为
    if(){}
    else if(){}
    else {}
      

  2.   

    我查看了下IL代码以下是两个小例子:第一种分支C#代码static void Main(string[] args)
            {
                int i = 1;
                if (i < 10)
                {
                    Console.WriteLine("个位数");
                }
                else
                {
                    if (i < 100)
                    {
                        Console.WriteLine("十位数");
                    }
                    else
                    {
                        Console.WriteLine("百位数以上");
                    }
                }
                Console.Read();
            }
    第二种分支C#代码static void Main(string[] args)
            {
                int i = 1;
                if (i < 10)
                {
                    Console.WriteLine("个位数");
                }
                else if (i < 100)
                {
                    Console.WriteLine("十位数");
                }
                else
                {
                    Console.WriteLine("十位数");
                }
                Console.Read();
            }
    以下是两种分支代码的IL代码:第一种分支的IL代码.method private hidebysig static void  Main(string[] args) cil managed
    {
      .entrypoint
      // Code size       79 (0x4f)
      .maxstack  2
      .locals init ([0] int32 i,
               [1] bool CS$4$0000)
      IL_0000:  nop
      IL_0001:  ldc.i4.1
      IL_0002:  stloc.0
      IL_0003:  ldloc.0
      IL_0004:  ldc.i4.s   10
      IL_0006:  clt
      IL_0008:  ldc.i4.0
      IL_0009:  ceq
      IL_000b:  stloc.1
      IL_000c:  ldloc.1
      IL_000d:  brtrue.s   IL_001e
      IL_000f:  nop
      IL_0010:  ldstr      bytearray (2A 4E 4D 4F 70 65 )                               // *NMOpe
      IL_0015:  call       void [mscorlib]System.Console::WriteLine(string)
      IL_001a:  nop
      IL_001b:  nop
      IL_001c:  br.s       IL_0048
      IL_001e:  nop
      IL_001f:  ldloc.0
      IL_0020:  ldc.i4.s   100
      IL_0022:  clt
      IL_0024:  ldc.i4.0
      IL_0025:  ceq
      IL_0027:  stloc.1
      IL_0028:  ldloc.1
      IL_0029:  brtrue.s   IL_003a
      IL_002b:  nop
      IL_002c:  ldstr      bytearray (41 53 4D 4F 70 65 )                               // ASMOpe
      IL_0031:  call       void [mscorlib]System.Console::WriteLine(string)
      IL_0036:  nop
      IL_0037:  nop
      IL_0038:  br.s       IL_0047
      IL_003a:  nop
      IL_003b:  ldstr      bytearray (7E 76 4D 4F 70 65 E5 4E 0A 4E )                   // ~vMOpe.N.N
      IL_0040:  call       void [mscorlib]System.Console::WriteLine(string)
      IL_0045:  nop
      IL_0046:  nop
      IL_0047:  nop
      IL_0048:  call       int32 [mscorlib]System.Console::Read()
      IL_004d:  pop
      IL_004e:  ret
    } // end of method Program::Main
    第二种分支的IL代码.method private hidebysig static void  Main(string[] args) cil managed
    {
      .entrypoint
      // Code size       77 (0x4d)
      .maxstack  2
      .locals init ([0] int32 i,
               [1] bool CS$4$0000)
      IL_0000:  nop
      IL_0001:  ldc.i4.1
      IL_0002:  stloc.0
      IL_0003:  ldloc.0
      IL_0004:  ldc.i4.s   10
      IL_0006:  clt
      IL_0008:  ldc.i4.0
      IL_0009:  ceq
      IL_000b:  stloc.1
      IL_000c:  ldloc.1
      IL_000d:  brtrue.s   IL_001e
      IL_000f:  nop
      IL_0010:  ldstr      bytearray (2A 4E 4D 4F 70 65 )                               // *NMOpe
      IL_0015:  call       void [mscorlib]System.Console::WriteLine(string)
      IL_001a:  nop
      IL_001b:  nop
      IL_001c:  br.s       IL_0046
      IL_001e:  ldloc.0
      IL_001f:  ldc.i4.s   100
      IL_0021:  clt
      IL_0023:  ldc.i4.0
      IL_0024:  ceq
      IL_0026:  stloc.1
      IL_0027:  ldloc.1
      IL_0028:  brtrue.s   IL_0039
      IL_002a:  nop
      IL_002b:  ldstr      bytearray (41 53 4D 4F 70 65 )                               // ASMOpe
      IL_0030:  call       void [mscorlib]System.Console::WriteLine(string)
      IL_0035:  nop
      IL_0036:  nop
      IL_0037:  br.s       IL_0046
      IL_0039:  nop
      IL_003a:  ldstr      bytearray (41 53 4D 4F 70 65 )                               // ASMOpe
      IL_003f:  call       void [mscorlib]System.Console::WriteLine(string)
      IL_0044:  nop
      IL_0045:  nop
      IL_0046:  call       int32 [mscorlib]System.Console::Read()
      IL_004b:  pop
      IL_004c:  ret
    } // end of method Program::Main
      

  3.   

    第一分支相比第二分支,除了多了2个nop辅助debug的空指令,其他都一样,可以说两者执行效率上应该没区别下面是没有nop的Release版本的IL代码:第一种分支的IL代码.method private hidebysig static void  Main(string[] args) cil managed
    {
      .entrypoint
      // Code size       53 (0x35)
      .maxstack  2
      .locals init ([0] int32 i)
      IL_0000:  ldc.i4.1
      IL_0001:  stloc.0
      IL_0002:  ldloc.0
      IL_0003:  ldc.i4.s   10
      IL_0005:  bge.s      IL_0013
      IL_0007:  ldstr      bytearray (2A 4E 4D 4F 70 65 )                               // *NMOpe
      IL_000c:  call       void [mscorlib]System.Console::WriteLine(string)
      IL_0011:  br.s       IL_002e
      IL_0013:  ldloc.0
      IL_0014:  ldc.i4.s   100
      IL_0016:  bge.s      IL_0024
      IL_0018:  ldstr      bytearray (41 53 4D 4F 70 65 )                               // ASMOpe
      IL_001d:  call       void [mscorlib]System.Console::WriteLine(string)
      IL_0022:  br.s       IL_002e
      IL_0024:  ldstr      bytearray (7E 76 4D 4F 70 65 E5 4E 0A 4E )                   // ~vMOpe.N.N
      IL_0029:  call       void [mscorlib]System.Console::WriteLine(string)
      IL_002e:  call       int32 [mscorlib]System.Console::Read()
      IL_0033:  pop
      IL_0034:  ret
    } // end of method Program::Main
    第二种分支的IL代码.method private hidebysig static void  Main(string[] args) cil managed
    {
      .entrypoint
      // Code size       53 (0x35)
      .maxstack  2
      .locals init ([0] int32 i)
      IL_0000:  ldc.i4.1
      IL_0001:  stloc.0
      IL_0002:  ldloc.0
      IL_0003:  ldc.i4.s   10
      IL_0005:  bge.s      IL_0013
      IL_0007:  ldstr      bytearray (2A 4E 4D 4F 70 65 )                               // *NMOpe
      IL_000c:  call       void [mscorlib]System.Console::WriteLine(string)
      IL_0011:  br.s       IL_002e
      IL_0013:  ldloc.0
      IL_0014:  ldc.i4.s   100
      IL_0016:  bge.s      IL_0024
      IL_0018:  ldstr      bytearray (41 53 4D 4F 70 65 )                               // ASMOpe
      IL_001d:  call       void [mscorlib]System.Console::WriteLine(string)
      IL_0022:  br.s       IL_002e
      IL_0024:  ldstr      bytearray (7E 76 4D 4F 70 65 E5 4E 0A 4E )                   // ~vMOpe.N.N
      IL_0029:  call       void [mscorlib]System.Console::WriteLine(string)
      IL_002e:  call       int32 [mscorlib]System.Console::Read()
      IL_0033:  pop
      IL_0034:  ret
    } // end of method Program::Main
    两者完全一样,那执行应该没区别了
      

  4.   

    第二个分支的IL代码有一句拷错了IL_003a:  ldstr      bytearray (41 53 4D 4F 70 65 )                               // ASMOpe
    改为
    IL_003a:  ldstr      bytearray (7E 76 4D 4F 70 65 E5 4E 0A 4E )                   // ~vMOpe.N.N
    不影响这个例子的说明
      

  5.   

    我用最简单的话说吧  if只能搭配一个else
    if(){}else{}这样就是二选一执行
    if(){}else if(){} else{}这样是从开头到结尾都要判断一次 也就是进去后直到遇到else{}才结束
      

  6.   

    但是很多时候我们都用switch(){ case XX:break; default: break};来代替 if(){} else if()..
      

  7.   

    if(){}
    else if(){}
    else if(){}
    效率高,第一个if成立,后面的都不会执行判断全是if的话,
    每个if都要判断一遍
      

  8.   

    if(){}
    else if(){}
    else if(){}
    等效于case语句
      

  9.   


     第二分支的C#代码里面最后一句输出应该是Console.WriteLine("百位数以上");也就是导致IL不一致的原因,额,赋值代码惹的祸
      

  10.   

    当if用来判断的变量volatile的话,两者的逻辑不等价。
      

  11.   

    说实话,你这两种写法其实是一样的。
    if (a>1){
      Console.Write("a大于1");
    }
    else{
      Console.Write("a小于等于1");
    }if (a>1)
      Console.Write("a大于1");
    else
      Console.Write("a小于等于1");这两个是一样的,当if条件只带一行代码时,可以省略{}。
    也就是说
    if (){}
    else if{}
    实际上就是
    if (){
    }
    else{
      if(){
      }
    }
      

  12.   

    if(){}else if(){},这样的结构不清晰;
    if()
    {}
    else if()
    {}
    这样的写法结构清晰,易于排错!
      

  13.   

    第二种 不是遇到else 才结束,是遇到符合条件的就结束、
      

  14.   

    哇,CSDN上面的确是高手云集啊。