【问题标题】:is there any specific reason why you wouldn't use nested if statements? [closed]为什么不使用嵌套的 if 语句有什么具体原因吗? [关闭]
【发布时间】:2014-03-09 22:01:54
【问题描述】:

使用嵌套的 if 语句和使用一个有很多参数的长 if 语句有区别吗?

例如

if ( var1 == var2 && var3 == var4 )
{
  //do something
}

if ( var1 == var2 )
{
  if ( var3 == var4 )
  {
    //do something
  }
}

我想知道这样做有什么不同吗?

谢谢

【问题讨论】:

  • 第二种格式的灵活性更大。假设只有当 var1 == var2 时才应检查另一个条件。如果您使用第一种格式,则必须重新检查 var1 == var2。
  • 在许多语言中,这两个代码都会被编译成相同的二进制文件。同样在大多数情况下,不需要创建额外的缩进。我会在这种形式中使用嵌套的if,例如,如果有一个仅取决于var3 == var4 条件的else 语句。
  • 一切都与可读性和编码风格有关。尽量保持代码简单易读。在性能方面,由于lazy evaluation,这两个语句是相等的。
  • 该问题既是基于意见的问题,也是语言标签垃圾邮件的示例。在一种语言中正确的(例如执行优化)在另一种语言中不一定正确。

标签: c# java php c++ vb.net


【解决方案1】:

通常,编译器会为这两个变体生成相同或几乎相同的代码。对于支持短路的解释型语言(在确定结果时不评估 || 或 && 的第二部分),它也几乎是一样的。

我的建议是使用能最清楚地代表您想做的事情的表格。

例如,如果我们要检查两个坐标是否匹配:

if (x1 == x2 && y1 == y2) 

Buf 如果你的代码是这样的:

if (country_of_origin == "Sweden")
{
    if (today == thursday)
    {
       ... 
    }
}

可能更有意义...

【讨论】:

    【解决方案2】:

    第二种样式允许检查需要独立于第一个 if 条件进行的检查。

    例如,如果您需要在 (var3 != var4) 但 (var1 == var2) 仍然存在的额外条件下做某事,则不可能:

    "if(var1 == var2 && var3 == var4)"

    因此,您需要以下内容:

    if(var1 == var2){
        if(var3 == var4){
    
        }
    
        //more code...
        //... var3 & var 4 change...
        //
    
        if(var3 != var4){
    
        }
    }
    

    正如评论者@Solace 所说,它只是允许更大的灵活性。

    【讨论】:

    • 第二部分当然和“else”一样,减少计算(当然除非var3或var4发生了变化)。
    【解决方案3】:

    它们都做同样的事情,但我个人认为嵌套更整洁,它还允许在嵌套 if 的任一侧执行代码,这通常是必需的

    if ( var1 == var2 )
    {
         //do something here based on the first if but before second if
    
      if ( var3 == var4 )
      {
        //do something 
      }
        //do something here also which may be different based on the nested if result
    }
    


    但是如果你不需要这个,那么你的第一个代码可能会稍微快一点,只需要一个 if

    【讨论】:

    • "is probably a tiny bit faster" -- 你能这样概括所有标记的语言吗?诚然,尽管这个问题被语言标签垃圾邮件污染了。
    • 在任何语言上打字都快一点:)))
    • @HovercraftFullOfEels 我标记了多种语言以收到快速回复,因为这个问题非常笼统,与一种特定语言无关,除了 vb.net 可能你必须结束 if 语句.. .
    • @KyleT:您不应该为了快速响应而发送垃圾标签。一种语言的答案通常不适用于另一种语言。
    【解决方案4】:

    不同的情况需要不同的解决方案:

    if ( width == height && width == depth )
    {
      // Its a cube!
    }
    
    if ( x == y )
    {
      if ( p == q )
      {
        //do something for when x == y but p == q
      } else {
        //do something for when x == y but p != q
    }
    

    您无法一概而论应该或不应该使用哪些构造 - 它们在某些情况下都是合适的。

    【讨论】:

      【解决方案5】:

      嗯,这取决于你的情况。如果和你的一样,那绝对没必要选择第二种方式。

      这是关于编写干净易读的代码 - 像 if (condition1 && condition2) 这样执行此操作意味着这两个条件对于以下代码片段都是绝对必要的。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-05-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多