代码之家  ›  专栏  ›  技术社区  ›  kofucii

“if”与“else if”

  •  11
  • kofucii  · 技术社区  · 14 年前

    有人告诉我,最好使用“if”语句,因为更难调试代码,何时使用“else if”?这句话有一点道理吗?

    21 回复  |  直到 7 年前
        1
  •  50
  •   ChrisNel52    14 年前

    我在调试“else if”语句时从未遇到过问题。我认为使用“else if”语句是干净的,它可以与程序员通信,读取“elseif”语句组互斥的代码。

        2
  •  12
  •   KeithS    14 年前
    if(...)
    {
    }
    else if(...)
    {
    }
    

    完全等同于:

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

    以同样的方式:

    if(...)
       foo();
    else
       bar();
    

    完全等同于:

    if(...) foo();
    else bar();
    

    它是100%的风格,不管一个比另一个更可读还是更不可读,都是基于您的编程文化、语言以及语句的复杂程度的一个完全判断调用。

        3
  •  9
  •   Nick DeVore    14 年前

    if/if else语句不会产生错误代码,我会的。

        4
  •  8
  •   Wok    14 年前

    两者之间的区别 if else if 和中间那个一样 协调 独占 连词。

        5
  •  8
  •   user180326    14 年前

    也许你的老板只是想早点回来。

    我不经常需要 if / else . 但那不是因为 else 是错的,但是因为我喜欢提前退货,如果你使用提前退货,你就不需要那么多其他的了。

    所以不是:

    boolean validate(DomainObject o) {
      boolean valid = false;
      if (o.property == x) {
         valid = true;
      } else if (o.property2 == y) {
         valid = true;
      } ...
      return valid; 
    }
    

    我喜欢打字:

    boolean validate(DomainObject o) {
    
      if (o.property == x) 
         return true;
    
      if (o.property2 == y) 
         return true;
    
      return false; 
    }
    
        6
  •  3
  •   Michael Myers KitsuneYMG    14 年前

    “else if更难调试”这句话很荒谬。我建议你以后不要向那个人求助。

    使用语义正确的解决方案。如果解决方案是:

    if a is true do a.action
    if a is not true and b is true, then do b.action
    otherwise do c.action
    

    然后 else if 是适当的。例如:

    if (a == true)
    {
      // do a.action
    }
    else if (b == true)
    {
      // do b.action
    }
    else
    {
      // do c.action
    }
    

    如果解决方案是:

    if a is true do a.action
    if b is true do b.action
    if c is true do c.action
    

    然后 否则如果 不合适。例如:

    if (a == true)
    {
      // do a.action
    }
    if (b == true) // note that we don't care if a was true
    {
      // do b.action
    }
    if (c == true) // care about neither a nor b
    {
      // do c.action
    }
    
        7
  •  2
  •   Spudley Pat    14 年前

    在正常使用中,没有什么问题 else if 完全。事实上,我认为它是一种重要的编码技术。

    唯一的时间 否则如果 问题是当你把它们串在一起的时候-我不得不调试有数千行的遗留代码,包括一页又一页的if,elseif,elseif,elseif……无限大。现在 那个 是错误代码。别那么做。

    这类事情可能会给你一个糟糕的“如果”的体验,但这只是糟糕的编码;如果没有其他的,你也可以做同样糟糕或更糟糕的事情。

        8
  •  2
  •   Rossini    14 年前

    我喜欢这句老话“调试比写代码难两倍”,所以如果你写的代码像你所能写的那么聪明,从定义上讲,你就没有足够的聪明去调试它。因此,我尝试使代码易于读取和调试(有时这是不可能的)。也就是说,我不认为别人很聪明,所以我会继续使用它。

        9
  •  1
  •   Daniel Rodriguez    14 年前

    我认为这不是真的。if,else if语句非常简单,易于调试。我想这可能取决于调试人员,但根据我的经验,没有任何区别,而且我也没有听到任何人在尖叫:“该死的,如果!”在调试他的代码时。

        10
  •  0
  •   chrismh    14 年前

    如果“else-if”是一个非首选的结构,那么为什么几乎每种现代语言都提供它呢?我认为你可以继续使用其他的假设…此外,当它撞到组件时,它就完全是一个跳跃/转到;()

        11
  •  0
  •   Brian M. Hunt    14 年前

    我也不同意。“else if”没有什么本质上更困难的;它是否是正确的编程方法取决于每个应用程序。在某些情况下,“switch”或“case”语句更好,但同样,这取决于应用程序。

    在我看来,制定这样的硬性规定太过局限了。

        12
  •  0
  •   Rui Curado    14 年前

    这两种形式都采用相同的调试工作。我敢说“else if”语句实际上使调试更容易…

    此外,“else if”语句提高了性能,因为您的程序不必检查实际上相互排斥的条件!

        13
  •  0
  •   The Surrican    14 年前

    为什么不尝试在代码中搜索n用ifs替换所有其他ifs?它将编译,但只有在您幸运的时候才能按需要执行…

    这是不一样的,有一个原因,为什么有如果和为什么有其他如果。

    前任:

    if(3<5) {
     print('blah');
    } else if(4<5) {
     print('blub');
    }
    // blah
    
    if(3<5) {
     print('blah');
    } 
    if(4<5) {
     print('blub');
    }
    // blahblub
    

    我个人更喜欢橘子!苹果是如此的普通… 我认为香蕉也很好(但这种情况会不时发生变化!)

    还有switch语句。

    这些控制结构都做了一些不同的事情,并且不是多余的,这就是为什么它们都存在的原因。 你不能说使用哪一种并不重要,它也不是样式或更好的可读代码之类的问题。

    我甚至会说,对于每个用例,都有一个最佳的控制结构可以使用!

    请考虑以下示例:

    if(money > 2000) {
     switch ($what-car-does-my-wife-want) {
         case "ferrari":
             echo "buying a ferrari";
             break;
         case "chevvy":
             echo "buying a chevvy";
             break;
         case "bmw":
             echo "buying a bmw";
             break;
     }
    
    } else {
     echo "i better not buy a new car";
    }
    if(money > 5000) {
     echo "wow i can buy a lot of other things too!";
    } else if(3000) {
     echo "wow that is a lot of money but i wish i had 5000!";
    }
    

    你唯一能做的就是替换

    if(money > 5000) {
     echo "wow i can buy a lot of other things too!";
    } else if(money > 3000) {
     echo "wow that is a lot of money but i wish i had 5000!";
    }
    

    通过

    if(money > 5000) {
     echo "wow i can buy a lot of other things too!";
    } else { 
        if(money > 3000) {
         echo "wow that is a lot of money but i wish i had 5000!";
        }
    }
    

    但我想这不是你要的?

        14
  •  0
  •   Chris Thornton    14 年前

    这比:

    if (a=1) then {
      DoThis;
      EXIT;  // Not sure if this works in your language, but you know what I mean...
    }
    if (a=2) then {
      DoThis;
      EXIT;
    }
    if (a=3) then {
      DoThis;
      EXIT;
    }
    
        15
  •  0
  •   Justin    14 年前

    “if语句”的形式为:

    if (condidtion1)
       statement1;
    else
       statement2;
    

    语句的有效形式之一是“if语句”。让我们将上面的'statement2'转换为'if语句' if (condition2) statement3;

    if (condition1)
       statement1;
    else if (condition2)
       statement3;
    

    空白和定位只是为了您的利益(可读性)。编译器本身对“else if”一无所知。

    这表明“if”和“else if”不是同一回事。else if'是复合语句。

    语句的另一个有效形式是用括号包围的语句块。这就是为什么你经常(通常)看到“if语句”中的括号。是否在单个语句周围使用它们只是风格问题。

    使用“else-if”的原因是,您不必处理已知将计算为false的“condition”表达式。你知道这是因为你已经检查过的其他条件。

    也许你的老板说你可能在这些假设中犯了一个错误,“如果”的陈述可能隐藏了一些细微的错误。我想这是完全可能的。不过,这对我来说似乎不值得花这么多钱。

    关于“switch语句”,他有什么要说的?

        16
  •  0
  •   JPCF    14 年前

    无论您以何种方式编写代码,您都应该记住,可以使用语言语法来提高代码的可读性,并向您的同事说明这些代码行背后的想法。 所以…明智的选择任何一种方式。误用的一个例子是吸收许多 if 其他代码块中的块。这会使代码不可读和不可维护。 也许你老板这么说是因为 不能。

        17
  •  0
  •   Jason    14 年前

    这取决于你想完成什么。两者都是可接受的编码形式,这取决于您正在做什么。例如,如果您希望确保检查每个比较并确保运行所有代码的可能性,那么应该使用单数形式 if 结构:

    if(condition1IsTrue) {
        methodThatMustRun1();
    }
    
    if(condition2IsTrue) {
        methodThatMustRun2();
    }
    
    ... etc
    

    在这个例子中, 全部的 使用运行的每个代码块的可能性检查条件。

    如果您只想从多个选项中运行一个代码块,那么应该使用 if else 结构,最好按照最常见到最不常见的顺序:

    if(condition1IsTrue) {
        mostCommonMethodToRun();
    } else if (separateConditionToCheckInCaseFirstFails) {
        nextMostCommonScenarioMethodToRun();
    } else if (...) {
        ... etc
    }
    

    在第二个示例中, 最多 检查所有条件,但可能只检查一个。然而, 正好一个 执行代码块(假设在没有条件的情况下有默认操作,则计算结果为true)。

    你的老板不一定像大家说的那样是个白痴,但你可能误解了他的意图。当您考虑它时,所有条件代码本质上都是由一些多选项代码(第二个示例)组成的独立块(第一个示例)。

    然而,如果你的老板教条主义地说,你永远不应该参与进来,那他可能是个白痴。 如果不是的话 构造。

        18
  •  0
  •   Moses    14 年前

    你在比较

    if (a=b) do this;
    if (a=c) do this;
    if (a=d) do this;
    

    到:

    if (a=b) do this;
    else if (a=c) do this;
    else if (a=d) do this;
    

    1)第一个示例更难调试,因为您没有第二个示例所提供的代码的自然工作流。

    2)正如Jason所指出的,第一个示例的性能不同于第二个示例,因为这三个if语句在任何情况下都将被测试,而第二个示例在变为真时将停止测试。

    你的老板是错的,尽管他也可以上网。

        19
  •  0
  •   tia    14 年前

    我是一个总程序员,有时我的下属误解了我。当我谈到具体的案例时,很多时候他们把它当作一个“规则”,并试图在代码库的任何地方强制执行它。我不确定这是不是你的情况,或者你的老板曾经是我的下属?

    关于这个问题, else if 对我来说很好,但是当他们不太多的时候,因为 否则如果 强制您读取它们上面的所有表达式,以了解何时执行其中的代码。

        20
  •  0
  •   user466087    14 年前

    JDV给出的答案似乎是正确的。 我来这里是想找一个非常类似西姆拉的答案。但是,问题所有者选择的答案不正确。正确/正确的答案是关于早期返回和清晰的样式,以及嵌套太多if-then-else语句通常不是一种好的编程风格的事实。因此,调试写得不好的代码总是更困难的。

    结论:条件代码应尽可能清晰/简单,以便在编程或调试阶段,人可以轻松地管理涉及的变量。

        21
  •  0
  •   vojta ripa    7 年前

    使用一堆 if 语句与使用完全不同 如果 然后 else if S.

    例子:

    if(x>5)
    {
        color="blue";
    }
    if(x>10)
    {
        color="red";
    }
    

    在这种情况下,如果我们使用15作为x,那么颜色将被覆盖 red .

    但是,如果我们使用 否则如果

    if(x>5)
    {
        color="blue";
    }
    else if(x>10)
    {
        color="red";
    }
    

    在这种情况下,颜色将是蓝色的,因为我们将忽略seconds语句,因为第一个语句已经是真的。