【问题标题】:The rules of Nested IF conditional statements without using curly braces不使用花括号的嵌套 IF 条件语句的规则
【发布时间】:2015-03-10 05:16:34
【问题描述】:

考虑到我已经有大约 2 年的编程经验,这可能是一个非常初学者的问题,但是嵌套的 IF 条件语句以及它们如何在没有花括号的情况下工作时总是困扰着我。

我一直使用大括号来保持我的编码井井有条。比如这样。

    public static void main(String[] args) 
{
    int x = 9;
    int y = 8;
    int z = 7; 
    if (x > 9)
    {
        if (y > 8)
        {
            System.out.println("x > 9 and y > 8");
        }
    }
    else if (z >= 7)
    {
        System.out.println("x <= 9 and z >= 7");
    }
    else 
    {
        System.out.println("x <= 9 and z < 7");
    }
}

我一直使用这种模式,因为它一直对我有用。

但是,为什么以这种格式编写的东西不能以同样的方式工作?

    public static void main(String[] args) 
{
    int x = 9;
    int y = 8;
    int z = 7; 
    if (x > 9)
        if (y > 8)
            System.out.println("x > 9 and y > 8");
    else if (z >= 7)
        System.out.println("x <= 9 and z >= 7");
    else 
        System.out.println("x <= 9 and z < 7");
}

第一个代码会打印出 x = 7,但第二个代码不会打印任何内容。 (我假设 else if 和 else 语句在初始 if 语句中)。

换句话说,当没有像上面的例子那样出现大括号时,编译器如何测试条件语句的规则是什么?我尝试在网上查找信息,但我似乎无法找到信息和/或我不知道如何专门调用此问题以研究我的疑问。

【问题讨论】:

标签: java c++


【解决方案1】:

如果我在上面加上大括号,编译器会这样。因为else ifelse 会立即找到if

if (x > 9) {
        if (y > 8){
            System.out.println("x > 9 and y > 8");
        }else if (z >= 7) {
            System.out.println("x <= 9 and z >= 7");
        }else {
            System.out.println("x <= 9 and z < 7");
        }
}

如果你必须复制,你应该至少放一个大括号:

if (x > 9) {
        if (y > 8)
            System.out.println("x > 9 and y > 8");
        else if (z >= 7)
            System.out.println("x <= 9 and z >= 7");
}else 
    System.out.println("x <= 9 and z < 7");

现在,Last else 肯定是第一个 if 语句。

【讨论】:

  • 我明白了。所以基本上“else if”和“else”将是最近的 if 的一部分?
  • 是的,毕竟编译器不理解你的业务逻辑。你必须做对;)
  • 有趣。那么如果最后一个“else”不是只有一个语句,而是两个语句,情况会怎样呢?第二个语句是否不再是 if 条件语句的一部分?
  • 每个 else 都应该有它的 if,但没必要每个 if 都有 else。所以你不能独自拥有其他一切。即如果“if”语句失败,则执行 Else。没有 if 就没有 else 的目的。以现实生活场景为例
【解决方案2】:

编译器不关心缩进。 else 子句始终与 last if 相关联,而该 if 还没有 else。这个:

if (x > 9)
    if (y > 8)
        System.out.println("x > 9 and y > 8");
else if (z >= 7)
    System.out.println("x <= 9 and z >= 7");
else 
    System.out.println("x <= 9 and z < 7");

和这个是一样的:

if (x > 9)
{
    if (y > 8)
    {
        System.out.println("x > 9 and y > 8");
    }
    else
    {
        if (z >= 7)
        {
            System.out.println("x <= 9 and z >= 7");
        }
        else
        {
            System.out.println("x <= 9 and z < 7");
        }
    }
}

另外,请注意else if(...) ... 实际上只是表示else {if(...) {...}} - 它是elseif 的组合,不是特殊功能。

【讨论】:

    【解决方案3】:

    这实际上不是花括号的问题,而是您如何格式化代码的问题。空格在 Java(或 C++)中无关紧要。

    所以当你写这个的时候:

    if (x > 9)
        if (y > 8)
            System.out.println("x > 9 and y > 8");
    else if (z >= 7)
        System.out.println("x <= 9 and z >= 7");
    else 
        System.out.println("x <= 9 and z < 7");
    

    这并不意味着它等同于您的原始代码。为了说明原因,下面是如何更合理地格式化这段代码:

    if (x > 9)
        if (y > 8)
            System.out.println("x > 9 and y > 8");
        else if (z >= 7)
            System.out.println("x <= 9 and z >= 7");
        else 
            System.out.println("x <= 9 and z < 7");
    

    我希望这能说明这里发生了什么。

    【讨论】:

      【解决方案4】:

      花括号本质上是为了让编译器保持正常运行。如果你只有1个if,1个else,如:

       if (x < 3)
          // some code here
       else
          // something else here
      

      当您在现实生活中做数学题时,运算顺序会告诉您先做括号中的内容,不是吗?花括号是一个分组符号,用于表示编译器要执行的操作顺序。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-06-14
        • 1970-01-01
        • 1970-01-01
        • 2012-05-03
        • 1970-01-01
        • 1970-01-01
        • 2023-01-16
        • 1970-01-01
        相关资源
        最近更新 更多