2014-09-15 3 views
0

Я хочу знать, почему строка 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?

ответ

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

0

Operator precedence.

Все двоичные операторы, за исключением операторов присваивания, оцениваются слева направо; операторы присваивания оцениваются справа налево.

Оператор + оценивается слева направо.

Вот почему в первом случае это дополнение. А во втором случае это конкатенация строк.

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); 

Вы ч ave a Строка и число Message3 + 5 = Сообщение53

Я надеюсь, что это очистит :)

Смежные вопросы