【问题标题】:println does not print the expected valueprintln 不打印期望值
【发布时间】:2012-12-06 12:15:22
【问题描述】:

这是我的代码:

public static void main(String[] arg)
{

    String x = null;
    String y = "10";
    String z = "20";

    System.out.println("This my first out put "+x==null?y:z);

    x = "15";

    System.out.println("This my second out put "+x==null?y:z);

}

我的输出是:

20
20

但我期待这个:

This my first out put 10
This my second out put 20

有人能解释一下为什么两个 println 调用的输出都为“20”吗?

【问题讨论】:

  • Sumit Singh 的回答解释了为什么输出是这样的。原因是运算符优先级,见this document

标签: java concatenation conditional-operator println


【解决方案1】:

试试

System.out.println("This my first out put "+ (x==null?y:z));

【讨论】:

  • 这确实会生成所需的输出,但不会回答 OP 的问题:有人可以解释一下为什么我得到“20”作为两个 println 的输出来电?
【解决方案2】:

System.out.println("This my first out put "+x==null?y:z); 会像

一样执行

("This my first out put "+x)==null?y:z 这永远不会是真的。因此,它将显示z 值。

例如:

int x=10;
int y=20;
System.out.println(" "+x+y); //display 1020
System.out.println(x+y+" "); //display 30

对于上述场景,操作执行从左到右

正如你所说,你期待这个:

This my first output 10

为此,您几乎不需要更改代码。试试这个

System.out.println("This my first output " + ((x == null) ? y : z));

【讨论】:

  • Java 中表达式的计算并不总是从左到右。它考虑了运算符的优先级!
  • @StephenC 我知道,但我只是在谈论这种情况。相反,它会增加更多的混乱,我从我的声明中删除了 ALWAYS。我相信,现在一切都会好的。 :)
【解决方案3】:

你需要尝试:

System.out.println("This my first out put "+(x==null?y:z));
x = "15";
System.out.println("This my second out put "+(x==null?y:z));

【讨论】:

    【解决方案4】:

    使用以下代码可以解决您的问题:问题是因为它正在使用 -

    System.out.println(("This my first out put "+x==null?y:z);   
    

    作为

    System.out.println(("This my first out put "+x)==null?y:z);

    public static void main(String[] arg)
    {
    
        String x = null;
        String y = "10";
        String z = "20";
    
        System.out.println("This my first out put "+(x==null?y:z));
    
        x = "15";
    
        System.out.println("This my second out put "+(x==null?y:z));
    
    }
    

    【讨论】:

    • +1,先回答真正的问题,为什么输出是这样的。