【问题标题】:In Java, is this considered an example of a "nested IF statement"?在 Java 中,这是否被视为“嵌套 IF 语句”的示例?
【发布时间】:2011-04-08 01:00:30
【问题描述】:

在这里,我们有一个长期存在的假设,需要在我的脑海中澄清。以下是嵌套“if”语句的示例:

if (...)
  ...;
else if (...)
  ...;

我的印象是嵌套需要一个“if”在另一个“if”中,就像这样:

if (...)
  if (...)
    ...;

或者当你嵌套在一个 else 中时,至少有一个明确的范围分离,就像这样:

if (...)
  ...;
else { //if the next statement didn't 
       //exist, then the curly brace changes nothing?
  ...;
  if (...)
    ...;
}

这可能归结为编译器如何解释事物,else-if 中的“if”是否被认为与父 if 处于同一级别,或者它们是否创建“新”“if”语句。感谢您的宝贵时间!

edit:我问是因为我是java实验室的TA,当天的主题是nested-ifs。最后,我发现老师认为我的第一个例子对于“嵌套 if 语句”是有效的。

【问题讨论】:

  • 我想一般来说你可以说,nested的意思是inside
  • 嵌套在什么意义上?我认为没有 ISO 定义。从可读性的角度嵌套?编译器解析?只是在里面?
  • 我会说这几乎与语言无关。
  • 恕我直言,您的老师弄错了。我相信他可能对“嵌套”这个词的含义有些困惑。
  • 如果老师的意图仅限于识别结构,我可以看出他们是错误的。但在语义上,我同意老师的观点——它是嵌套的。 “else”范围与其“if”范围具有相同的状态(功能和重要性)。

标签: java nested if-statement


【解决方案1】:

当然是嵌套的。嵌套与您格式化代码的方式无关。

if (...)
{
    // some code
}
else if (...)
{
    // some code
}
else
{
    // some code
}

完全等价于

if (...)
{
    // some code
}
else
{
    if (...)
    {
        // some code
    }
    else
    {
        // some code
    }
}

Java 中没有“else if”关键字,其效果纯粹是通过一种格式约定来实现的,该约定可以阻止长链嵌套 else 在屏幕上漂移。

如果有人需要说服,这里是 if 语句的规范:Java Language Specification section 14.9

【讨论】:

  • 感谢那里的额外“当然”,好像对此有明确的共识(其他评论员不同意你)
  • @swajak 其他评论员错了,这是正确的。然而,由于“嵌套”实际上只是概念上的一个问题,因此以这种方式布局它并没有与另一种方式相同的概念负担,因此实际上它不会像嵌套那样增加心理复杂性。
  • 我写了一个类似的答案,但@JeremyP 准确地捕捉到了我的想法 [甚至是“当然 :-)]。就“编译器如何解释事物”而言,else if 不是Java 语言语法的一部分就像在其他一些语言中一样。因此,我会说嵌套-ifthen-block 或另一个 @987654329 的 else-block 中的任何 if 语句@ 语句。Java 代码中else if 的使用实际上是嵌套的-if 作为 else 代码块的唯一语句嵌入。
  • 不知何故,我从来没有这样想过else if。不过既然你这么说,那就很有道理了。
  • 这是我们在学校所教的内容。
【解决方案2】:

这是一个if语句

if (condition1) {
    // ...
}

这是一个嵌套的 if 语句

if (condition1) {
    // ...
    if (condition2) {
        // ...
    }
    // ...
}

这是一个if-else 语句

if (condition1) {
    // ...
} else {
    // ...
}

这是一个链式 if-else 语句

if (condition1) {
    // ...
} else if (condition2) {
    // ...
}

【讨论】:

  • 取决于else是否包含任何逻辑。外部是if-else 语句,内部是嵌套的if 语句。如果else 不包含任何逻辑(因此您可以省略else 的大括号),那么它就变成了一个链式if-else 语句。
【解决方案3】:

嵌套的 if 是这样的:

if (...)
  if (...)
    ...;

你给出的第一个例子就是if/else

记住它的一个好方法是缩进随着嵌套的if 而增加,但对于if/else 它不会。

【讨论】:

  • +1 同意这一点。另一个是一个else if,这是一个嵌套的if。
  • 第一个块中的第二个if不是else块的语句吗?如果 (...) ...;否则 \n 如果 (...) ...;被您的回答视为嵌套 if?
  • @Jacob Tomaw - 好问题。在原始意义上,嵌套意味着内部,正如 Felix King 在 cmets 中对 OP 的问题所指出的那样。我会认为他的第三个示例中的 else 中的代码不是第一个 if 语句中的嵌套 if,相反,我只会认为它是 if/else,而 else 里面有更多的逻辑。我不会认为 else 部分中的 if 是第一个 if 语句中的嵌套 if。
  • 这是不正确的。第二个 if 实际上嵌套在第一个的 else 中——这就是嵌套(在 if 和 else 子句周围使用大括号自己查看)。
  • @Bill K - 那么你是对我的评论还是我的回答投了反对票(假设反对票来自你)?我从未在我的回答中评论过第三个例子。无论如何,在阅读您的 cmets 之后,我倾向于同意您的论点。
【解决方案4】:

从概念上讲,对我来说是第一种形式

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

不是嵌套的,因为所有条件都在同一逻辑级别进行评估。换句话说,我将其读作“基于 cond1:cond2:anything else 分支你的操作”。

if (cond1){ 
   if (cond2){ 
     if (cond3){ 

是嵌套的,因为您在其他条件中评估了条件,也就是说,依赖之前的条件。如果你想从字面上看,第二种情况下 cond2 的范围实际上嵌套在 cond1 的范围内。这在第一种形式中是不正确的。

我从没想过这是有争议的。

编辑:如果你曾经读过像this 这样的代码,那么差异可能看起来不那么学术。

【讨论】:

    【解决方案5】:

    我会假设所有三个嵌套的 if。由于对其他情况达成了普遍共识,因此我专注于您的第一个情况:

    从我的角度来看,这段代码是一个嵌套的 if,因为单个 if 类似于

    if(...) { } else { }
    

    else 部分是可选的。而且你已经有效地将 if 嵌套到外部 if else 的 else 部分,即使格式(可能是语义)暗示它不同。

    但实际上归结为“嵌套if”的确切定义,我认为没有一个普遍接受的定义。

    你为什么这么问? 如果这与代码效率有关,那么这不仅仅取决于嵌套级别。 如果这是由于一些关于 if 嵌套级别的准则,那么该准则应该明确它如何准确定义“嵌套 if”。

    【讨论】:

    • 我是一个java实验室的TA,今天的主题是nested-ifs。最后,我发现老师认为我的第一个例子对于“嵌套 if 语句”是有效的。
    【解决方案6】:

    我不认为第一种形式(if/else if/etcetera)是“嵌套的”。相反,它更类似于 switch 块,我也不认为它是嵌套的。

    【讨论】:

      【解决方案7】:

      我和你一样理解。

      如果实现秘密只支持“if”和“else”关键字,我想你可以认为“else if”中的“if”是嵌套在“else”语句中的if语句。但我不认为这很重要。在这种情况下,“else”的作用域仅包含“if”,因此它有效地表现为单个作用域。

      这是轻微的好奇心,还是您遇到了范围界定问题?

      【讨论】:

      • 我是一个java实验室的TA,今天的主题是nested-ifs。最后,我发现老师认为我的第一个例子对于“嵌套 if 语句”是有效的。
      • 这很奇怪,听起来像是概念上的歧义。现在我也得去问问我的教授。这会吞噬我的大脑! :P
      • "如果实现秘密地只支持 "if" 和 "else" 关键字" -- 这不是秘密,这正是大多数主要语言中的内容(值得注意的例外是 perl)。始终编​​写 else if 而不是将 if 嵌套在 else 中纯粹是一种风格选择。
      【解决方案8】:

      你可以嵌套一个 if 而不声明一个 else,这似乎是你的困惑。

      【讨论】:

      • Java 中没有 else-if 这样的关键字。
      【解决方案9】:

      该语句实际上以不规则形式嵌套的一个示例。

      你的表格是:

      if(statement1 == true)
         code1...;
      else if (statement2 == true)
         code2...;
      

      这等价于:

      if (statement1 == false)
         if (statement2 == true)
            code2...;
      else
         code1;

      但是,我认为以这种形式嵌套是一种糟糕的编程习惯。您应该能够重新排列代码以适应更传统的形式。

      【讨论】:

        【解决方案10】:

        如果它被放置在另一个 if 块中,则它是一个嵌套的 if。第一种情况是if-else 语句。

        【讨论】:

          【解决方案11】:

          在建设中

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

          else 标识一个隐含的ifif the antecedent is false

          if 嵌套在else 范围内,那么在我看来,在语义上符合嵌套if 语句的条件。

          【讨论】:

            【解决方案12】:

            嵌套if语句的意思是: 在 if 条件中放置另一个 if 条件

            【讨论】:

            • 您需要提供更多详细信息,例如示例等
            • 这道题8年了,所有的细节都被时间遗忘了。
            • 真的吗?您阅读了有关此问题的所有其他答案并认为缺少此信息?
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2019-07-18
            • 1970-01-01
            • 2013-12-06
            • 2012-01-30
            • 1970-01-01
            • 2014-03-09
            • 1970-01-01
            相关资源
            最近更新 更多