【问题标题】:nesting if statements [closed]嵌套 if 语句 [关闭]
【发布时间】:2011-08-05 14:28:37
【问题描述】:

在 if 块内或 else 块内嵌套 if 语句哪个更好?

一个。

if (cond1)
   if (cond2){
      statement1;
      statement2;
      ...
   }
   else {
      statement3;
      statement4;
      ...
   }

else {
   statement5;
   statement6;
   ...
}

b.

if (!cond1) {
   statement5;
   statement6;
   ...
}

else if (cond2) {
   statement1;
   statement2;
   ...
}

else {
   statement3;
   statement4;
   ...
}

感谢到目前为止的回复。我刚刚编辑了选项,但我主要关心的是:如果您有选择,(通过更改条件表达式)将 if 语句嵌套在更高级别的 if 语句块或 else 块中是否更好? (a) 只是将 if 嵌套在 if 块中的示例,(b) 是将 if 嵌套在 else 块中的示例。再次感谢大家的时间。

【问题讨论】:

  • 您应该根据贾斯汀的评论编辑您的示例。您是在寻找 if (cond) ... else if (cond2) {...} else {...} 还是 if (cond) ... else { if (cond2) {...} else {...}}?或者正如贾斯汀所说,嵌套的 if 与逻辑与?谢谢。
  • 这读起来非常模棱两可(我什至不知道正确的解析),所以请在第一种情况下在块周围添加花括号!

标签: coding-style if-statement nested


【解决方案1】:

编辑:感谢您澄清问题。现在的问题实际上是一种风格,归结为最易读的问题。一般来说,当你有一个真正的多路条件时,后者会更好,这意味着在代码中的某个时刻,三个可能的条件都同样可能且同样合理。当语义上 cond1 是 real 驱动程序时,前者可能更清晰,而 cond2 是一种人们只在 cond1 为真时才考虑的从属条件。

旧答案:

这是对问题的一种解释(“嵌套在 then”):

if (cond1) {
    if (cond2) {
        A
    }
} else {
    B
}

正如贾斯汀指出的那样,这应该写成

if (cond1 && cond2) {
    A
} else {
    B
}

除非有代码需要在if cond1 部分中if cond2 的范围内。

您的问题的另一种解释(“嵌套在 else 中”)是:

if (cond1) {
    A
} else {
    if (cond2) {
        B
    }
}

在这种情况下你应该重写为

if (cond1) {
    A
} else if (cond2) {
    B
}

因为它更好地表达了多路条件的思想。同样,如果有一些东西属于 not cond1 的范围但不属于 cond2 的范围,那么你需要嵌套。

希望对您有所帮助。

【讨论】:

  • 当它们不相等时,它们中的一个怎么能更好?最简单的嵌套 if 是“这是真的吗?如果是,那也是真的吗?”。 else if 是“这是真的吗?如果不是,那是真的吗?”。
  • 我只是在猜测 OP 的意图。如果没有即将进行的编辑,我将撤回答案。
  • @ray:是的,这就是我的意图。我只是想知道在 if 块或 else 块中嵌套 if 语句是否更好。
  • 感谢@Bill 的澄清。我编辑了答案以解决更新后的问题(在顶部)。
  • @Ray 当您说问题现在实际上是一种风格并且归结为最易读的问题时,您是说两者在性能方面是等效的(编译器认为它们等效)?
【解决方案2】:

实际上,您的示例不匹配。我会将第一个重写为:

if(cond && cond2)
{

}
else
{

}

我唯一会嵌套像您的第一个示例这样的 if 语句是:

if(cond)
{
    if(cond2)
    {
        // Stuff that requires both conditions to be true.
    }

    // Stuff that requires only the first condition to be true.
}
else
{

}

【讨论】:

  • 你的两个版本不等价!考虑cond = truecond2 = false
  • @Kerrek SB - 我的两个版本并不等同。第二个是为了在我使用嵌套 if 语句时显示不同的条件。
  • 如果你的整个 if 块是另一个 if 语句,那很好。如果您在第二条 if 语句之前或之后还有其他代码,那么尝试将其组合成一个单一的决策结构可能会导致一些令人讨厌的代码重复。
  • @Justin:您的第一个版本也不等同于 OP 的第一个版本。我实际上不知道 OP 的第一个版本被解释为哪种方式,但两种方式都与您的不同。
【解决方案3】:

编辑:在这种情况下,我认为两者都不一定更好。在我看来,(b)更容易阅读和遵循逻辑。任何一个都可以!

(a) 中的 else 是与第一个 if 语句还是第二个 if 语句一起使用?顺便说一句,我会假设它与第一个 if 语句一起使用,但如果是这种情况,那么您的两个示例在逻辑上就不一样了。

【讨论】:

    【解决方案4】:

    例子:

    <?php 
        if(find_user($email)){
            if(check($email,$password)){
                $_SESSION['email'] = $email;
                setcookie("name",$_SESSION['name'],time() +40);
                header("Location: index.php");
            }else{
                echo "incorrect email or password";
            }
        }else{
            echo "username not found !";
        }
        ?>
        
        <?php 
        if(find_user($email)){
            if(find_user($name)){
                if(check($password,$passwordcp)){
               $f = "readme.txt";
               $file = fopen($f,"a+");
               fwrite($file,"\n".$email.","$password.",".$name);
               fclose($file);
                }else{
                echo "Password contains invalid characters";
            }else{
                echo "username already exist !";
            }
        }else{
            echo "email already exist !";
        }
        ?>
    

    【讨论】:

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