用AND替换嵌套的if语句

5

我想知道嵌套的if语句是否比AND语句更好。我有一个循环,它会执行很多次,所以我在考虑是否有更快的执行方法。下面的代码与我的代码具有相同的逻辑。嵌套的if语句在循环内部。

   for ( int i = 0; i < array.length; i++)
   {
      // do stuff
      if (x == 5)
      {
         if (y == 3)
         {
             // do stuff
         }
      }
   }  

如果我用这个AND语句代替嵌套的if语句,我的代码会更快吗?

     if ((x == 5) && (y == 3))
           // do stuff

我已经阅读了这个链接,但是没有找到答案。我是一名学生,仍在学习中,感谢所有的反馈!

4个回答

9
不会对性能产生显著影响,但可读性可能会有所不同。 两者在进行优化/发布编译时将生成相同的IL代码(在LINQPad中测试)。
IL_0000:  ldc.i4.5    
IL_0001:  stloc.0     
IL_0002:  ldc.i4.s    0A 
IL_0004:  stloc.1     
IL_0005:  ldloc.0     
IL_0006:  ldc.i4.5    
IL_0007:  bne.un.s    IL_000D
IL_0009:  ldloc.1     
IL_000A:  ldc.i4.3    
IL_000B:  pop         

即使没有优化,差异也不是很大:
嵌套语句:
IL_0001:  ldc.i4.5    
IL_0002:  stloc.0     
IL_0003:  ldc.i4.s    0A 
IL_0005:  stloc.1     
IL_0006:  ldloc.0     
IL_0007:  ldc.i4.5    
IL_0008:  ceq         
IL_000A:  ldc.i4.0    
IL_000B:  ceq         
IL_000D:  stloc.2     
IL_000E:  ldloc.2     
IL_000F:  brtrue.s    IL_0020
IL_0011:  nop         
IL_0012:  ldloc.1     
IL_0013:  ldc.i4.3    
IL_0014:  ceq         
IL_0016:  ldc.i4.0    
IL_0017:  ceq         
IL_0019:  stloc.2     
IL_001A:  ldloc.2     
IL_001B:  brtrue.s    IL_001F
IL_001D:  nop         
IL_001E:  nop 

非嵌套语句:

IL_0001:  ldc.i4.5    
IL_0002:  stloc.0     
IL_0003:  ldc.i4.s    0A 
IL_0005:  stloc.1     
IL_0006:  ldloc.0     
IL_0007:  ldc.i4.5    
IL_0008:  bne.un.s    IL_0013
IL_000A:  ldloc.1     
IL_000B:  ldc.i4.3    
IL_000C:  ceq         
IL_000E:  ldc.i4.0    
IL_000F:  ceq         
IL_0011:  br.s        IL_0014
IL_0013:  ldc.i4.1    
IL_0014:  nop         
IL_0015:  stloc.2     
IL_0016:  ldloc.2     
IL_0017:  brtrue.s    IL_001B
IL_0019:  nop 

@Almo,如果你不需要嵌套if语句,那么这样做会导致代码难以阅读,但这是主观的(也许) :) - Filip Ekberg
2
我同意你的观点,但是“但在可读性上”这个短语没有任何意义。这很讽刺,因为它评论了可读性,但本身却不易读。 :) - Almo
@Almo,哈哈,我想我只能把它归咎于不是母语人士! - Filip Ekberg
学习英语可能没有法语那么难,但也不容易。 :) - Almo
它们将被编译为相同的程序集(在此代码中),因此没有任何区别。 - Saeed Amiri
添加了一些 IL 代码以表明在使用发布/优化编译时没有区别,但在未使用优化/调试编译时有区别。即使没有进行优化,差异也不显著。 - Filip Ekberg

3

不会有区别。然而,如果条件较少,则使用AND可以减少代码行数并提升可读性。

有时候,if语句更好并且更自然,例如以下常见的情况:

String s=//...
if(s==null)return;
if(s.Length > 0) //do something

使用AND时,可以替换为:

if ((s!=null) && (s.Length > 0)) //Dosomething

许多开发者会犯这个错误:

if ((s.Length > 0) && (s!=null) ) //Dosomething

这将导致空引用异常。

从代码中可以看出,使用单独的if语句时,最自然的想法是先进行空值检查。


3

.NET会停止检查条件语句的第一部分,因此这两个条件语句之间没有性能差异。


这个逻辑在 AND 语句中也会发生吗? - blenzcoffee
这就是我的意思。在 and 语句中,如果第一部分是假的,它就不会再去检查第二部分了。 - Kyeotic
1
这被称为短路运算,所有逻辑运算符都会尽可能地进行短路运算,这意味着如果它们知道结果必须是真/假,它们立即停止执行任何其他语句,因为它们无法影响结果。 - Servy

1
在编译代码中,速度不应该有任何差异,它们将转换为完全相同的汇编代码。我绝对同意可读性因素,并且这也会缩短您的类长度。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接