【问题标题】:Curly braces in if-else blocksif-else 块中的花括号
【发布时间】:2015-07-25 06:52:50
【问题描述】:

我正在用 java 编程,我碰巧发现自己有这个:

if(nodo == null) return null;
    else if(nodo.izquierda!=null && nodo.derecha==null)
        return nodo.izquierda;
    else if(nodo.izquierda==null && nodo.derecha!=null)
        return nodo.derecha;
    else return null; // si ambos hijos son nulos o no nulos

我的问题是:写成这样是不是一样的:

if(nodo == null) 
    return null;
else {
    if(nodo.izquierda!=null && nodo.derecha==null)
        return nodo.izquierda;
    else {
        if(nodo.izquierda==null && nodo.derecha!=null)
              return nodo.derecha;
        else return null; // si ambos hijos son nulos o no nulos
    }
 }

最让我困惑的是如何将花括号与 if-else 块一起使用。一定要用花括号吗?

例如:

if (something)
     if (something else)
     ...
     else (blah blah)

是否一样:

if (something)
{
     if (something else)
     ...
     else (blah blah)
}

【问题讨论】:

  • if 语句不需要大括号。如果它们不存在,则如果子句为真,则将使用下一个参数,并且仅使用下一个参数。你的 else 语句也是如此。如果没有括号,则只有下一条语句是 else 子句的一部分,其他任何内容都不会被视为您的 if...else... 语句的一部分
  • 大括号用来封装代码块。使用带有适当缩进的括号通常是一个好主意,这样读者就可以清楚地知道什么代码属于哪里。如果语句不使用大括号表示单行可能会因节省的 2 或 3 个字节而感到自豪,但是我发现它是在代码中引入错误的最简单方法之一,因为小的输入错误很容易改变大大量的逻辑。

标签: java if-statement curly-braces


【解决方案1】:

例如:

if (something)
      if (something else)
      ...
      else (blah blah)

是否一样:

 if (something)
   {
      if (something else)
      ...
      else (blah blah)
   }

在这种情况下,是的,它们是相同的,但前者比后者更难阅读。我建议始终使用大括号,即使对于由单行组成的代码块也是如此。

【讨论】:

    【解决方案2】:

    对于 Java,大括号对于 if-else 语句是可选的。正如 Jared 所说,当省略花括号时,只会执行下一条语句。

    通常大括号有助于代码的组织和可读性,因此它们通常会被使用。

    【讨论】:

      【解决方案3】:

    • 最后两条语句执行相同;省略大括号是合法的,但不建议这样做。

    • 如果 else if 省略大括号,else if 始终属于 最内层 if 语句。

      REFERENCE: Link to the IF ELSE behavior if braces are Omitted
    • 此 URL:Link to Study of Code with Braces Omitted 包含分析结果,并指出带有省略“if 语句”大括号的代码的项目更有可能出现错误。
    • 如果开发人员故意省略大括号(这是合法的),下一个查看没有大括号的代码的开发人员将不得不在心理上“解析”每个 else if 并将 else if 匹配到最接近的 if 语句。如果大括号是缩进对齐的,那么将 if 匹配到 else ifelse 会容易得多。
    • 当* if 语句中的大括号内的代码缩进 4 个空格,而二级 if 语句中的代码缩进 8 个空格时,代码最容易阅读,如下所示:
      if (var1 == 1) {
          action1();
      }
      else if (var1 == 2) {
          action2();
      }
      else if (var1 == 3) {
      
          if (var2 == 1) {
              action31();
          }
          else if (var2 == 2) {
              action32();
          }
      }
      

    • 【讨论】:

        【解决方案4】:

        我的问题是:写成这样是不是一样的:

        您需要询问的事实是使用大括号的一个很好的理由。代码总是有两种受众,一种是编译器,另一种是任何可能需要阅读和推理代码的人,包括你未来的自己。

        通常,编译器不需要大括号,但可以提高其他用户的可读性。

        【讨论】:

          【解决方案5】:
          if(nodo != null)
              if(nodo.izquierda != null && nodo.derecha == null)
                  return nodo.izquierda;
              else if(nodo.izquierda == null && nodo.derecha != null)
                  return nodo.derecha;
          return null;
          

          【讨论】:

          • 虽然此代码可以解决问题,including an explanation 说明如何以及为什么解决问题将真正有助于提高您的帖子质量,并可能导致更多的赞成票。请记住,您正在为将来的读者回答问题,而不仅仅是现在提问的人。请编辑您的答案以添加解释,并说明适用的限制和假设。