标准输出流的不明确行为

时间:2014-09-15 10:16:30

标签: java arguments output outputstream

我想知道为什么以下代码的第5行和第6行的输出不同?

  /*1*/      class A
  /*2*/      {
  /*3*/         public static void main(String[] args)
  /*4*/         {
  /*5*/             System.out.println(3+5+"Message");
  /*6*/             System.out.println("Message"+3+5);
                }
        }

输出:

8Message
Message35

为什么第二行代码有35而不是8而不是35

3 个答案:

答案 0 :(得分:0)

Operator precedence

  

除了赋值运算符之外的所有二元运算符都是从左到右计算的;赋值运算符从右到左进行求值。

操作符+从左到右进行评估。

这就是为什么在第一种情况下它是加法。在第二种情况下,它是字符串连接。

答案 1 :(得分:0)

System.out.println(3+5+"Message");

从左到右评估表达。左右+是整数,因此+的加法和右边是字符串连接 让我们以这种方式打破它(3+5+"Message")

3=integer
+=operator
5=integer

(3)integer (+) (5)integer = (8)integer,

而不是下一次传递

(8)integer (+) ("Message")String = (8Message)String

因此输出为8Message

System.out.println("Message"+3+5);

这里从开始+运算符开始,字符串因此会发生连接。 因此输出为Message35

答案 2 :(得分:0)

Like the post above sais, you have operator precedence. Everything is evaluated from left to right.


System.out.println(3+5+"Message");

被翻译为

System.out.println((3+5)+"Message"); So first the addition happens and the result concatenates with the string.

在另一种情况下:

System.out.println("Message"+3+5);  

被翻译为

System.out.println(("Message"+3)+5);  

你有一个字符串和一个数字Message3 + 5 = Message53

我希望这清除它:)

相关问题