在 Java 中,这是不是被视为“嵌套 IF 语句”的示例?

Posted

技术标签:

【中文标题】在 Java 中,这是不是被视为“嵌套 IF 语句”的示例?【英文标题】: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”范围具有相同的状态(功能和重要性)。 【参考方案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年了,所有的细节都被时间遗忘了。 真的吗?您阅读了有关此问题的所有其他答案并认为缺少此信息?

以上是关于在 Java 中,这是不是被视为“嵌套 IF 语句”的示例?的主要内容,如果未能解决你的问题,请参考以下文章

Java 感觉在try语句中嵌套if语句不怎么美观,请问怎么优化

IT兄弟连 Java语法教程 流程控制语句 分支结构语句4

if--else 嵌套 怎么理解?

为啥我在switch-case语句下嵌套if-else语句会报错?怎么改?

Python流程控制语句

Excel嵌套if语句 - 需要帮助排除故障