2010-03-03 3 views
57

Можете ли вы объяснить мне вывод этого Java-кода?Как работают операторы post increment (i ++) и pre increment (++ i) на Java?

int a=5,i; 

i=++a + ++a + a++; 
i=a++ + ++a + ++a; 
a=++a + ++a + a++; 

System.out.println(a); 
System.out.println(i); 

Выход 20 в обоих случаях

+1

7 + 7 + 6 = 20. _____ – kennytm

+3

Всегда избегайте двусмысленных утверждений :) –

+7

@Prasoon Saurav В отличие от C и C++, Java и C# имеют строго определенный порядок оценки, поэтому эти утверждения не являются двусмысленными. –

ответ

88

Помогает ли это?

a = 5; 
i=++a + ++a + a++; => 
i=6 + 7 + 7; (a=8) 

a = 5; 
i=a++ + ++a + ++a; => 
i=5 + 7 + 8; (a=8) 
+5

Вы уверены, что == 9 во втором? –

+0

Вы правы, это не 9. Это 8. – kgiannakakis

+0

i = ++ a + ++ a + a ++; => i = 7 + 8 + 5; (a = 8), поскольку post increment имеет самый высокий приоритет, выполняется ли сначала ++? – rsirs

7

++a приращения a до того, как оценивается. a++ оценивает a, а затем увеличивает его.

, относящиеся к вашему выражению Дано:

i = ((++a) + (++a) + (a++)) == ((6) + (7) + (7)); // a is 8 at the end 
i = ((a++) + (++a) + (++a)) == ((5) + (7) + (8)); // a is 8 at the end 

В parenteses я использовал выше, неявно используется Java. Если вы посмотрите на термины таким образом, вы можете легко увидеть, что они оба одинаковы, поскольку они являются коммутативными.

+1

поэтому его код говорит: i = 6 + 7 + 7; i = 5 + 7 + 8 – user181750

+1

@ Коммутация KlasLindbäck означает, что вы можете менять оба выражения и получать одинаковый результат. Итак, ++ + ++ a == ++ a + a ++ (5 + 7 == 6 + 6; a == 7 в конце). – Aurril

15
i = ++a + ++a + a++; 

является

i = 6 + 7 + 7 

Работа: приращение до 6 (6 текущей стоимости) + приращение до 7 (текущего значения 7). Сумма составляет 13 теперь добавить его к текущему значению а (= 7), а затем приращение до 8. Сумма 20 и значение а после того, как завершается присвоение является 8.

i = a++ + ++a + ++a; 

является

i = 5 + 7 + 8 

Работа: При стартовом значении a это 5. Используйте его в добавлении, а затем увеличьте его до 6 (текущее значение 6). Приращение a от текущего значения 6 до 7 для получения другого операнда +. Сумма равна 12, а текущее значение a равно 7. Следующее приращение a от 7 до 8 (текущее значение = 8) и добавление его к предыдущей сумме 12 для получения 20.

+0

эти заявления работают справа налево или слева направо? – Abhijeet

1

, когда a 5, то a++ дает 5 к экспрессии и шагом a после этого, в то время как ++a шагом a перед передачей числа в выражении (что дает a 6 к выражению в данном случае).

Так рассчитать приращения

i = 6 + 7 + 7 
i = 5 + 7 + 8 
124

++a, а затем использует переменную.
a++ использует, а затем увеличивает эту переменную.

Если у вас есть

a = 1; 

и вы

System.out.println(a++); //You will see 1 

//Now a is 2 

System.out.println(++a); //You will see 3 

@codaddict объясняет свой конкретный фрагмент кода.

4

В приведенном выше примере

int a = 5,i; 

i=++a + ++a + a++;  //Ans: i = 6 + 7 + 7 = 20 then a = 8 

i=a++ + ++a + ++a;  //Ans: i = 8 + 10 + 11 = 29 then a = 11 

a=++a + ++a + a++;  //Ans: a = 12 + 13 + 13 = 38 

System.out.println(a); //Ans: a = 38 

System.out.println(i); //Ans: i = 29 
0
a=5; i=++a + ++a + a++; 

является

i = 7 + 6 + 7 

Рабочая: до/после инкремента имеет "право на лево" ассоциативности, и предварительно имеет приоритет над пост, поэтому первый из все предварительные приращения будут решаться как (++a + ++a) => 7 + 6. затем a=7 предоставляется приращение =>7 + 6 + 7 =20 и a =8.

a=5; i=a++ + ++a + ++a; 

является

i=7 + 7 + 6 

Рабочая: до/после инкремента имеет «право на лево» ассоциативности, и предварительно имеет приоритет над пост, поэтому в первую очередь предварительно прироста будет решать, как (++a + ++a) => 7 + 6 .then a=7 предоставляется на пост increment =>7 + 7 + 6 =20 и a =8.

0

Преинкремент и после приращения эквивалентны, если не в выражении

int j =0; 
int r=0   
for(int v = 0; v<10; ++v) { 
      ++r; 
      j++; 
      System.out.println(j+" "+r); 
    } 
1 1 
2 2 
3 3  
4 4 
5 5 
6 6 
7 7 
8 8 
9 9 
10 10 
1

Я считаю, однако, если вы объедините все ваши заявления и запустить его в Java 8.1 вы получите другой ответ, по крайней мере, что говорит мой опыт.

код будет работать следующим образом:

int a=5,i; 

i=++a + ++a + a++;   /*a = 5; 
           i=++a + ++a + a++; => 
           i=6 + 7 + 7; (a=8); i=20;*/ 

i=a++ + ++a + ++a;   /*a = 5; 
           i=a++ + ++a + ++a; => 
           i=8 + 10 + 11; (a=11); i=29;*/ 

a=++a + ++a + a++;   /*a=5; 
           a=++a + ++a + a++; => 
           a=12 + 13 + 13; a=38;*/ 

System.out.println(a);  //output: 38 
System.out.println(i);   //output: 29 
2

++, а является префиксом приращение Оператор:

  • результат вычисляется и сохраняется во-первых,
  • то используется переменная.

A ++ является приращение постфиксного оператора:

  • переменный используются сначала,
  • то результат вычисляется и сохраняется.

Как только вы запомните правила, EZ, чтобы рассчитать все!

1

Предполагая, что вы имели в виду

int a=5; int i; 

i=++a + ++a + a++; 

System.out.println(i); 

a=5; 

i=a++ + ++a + ++a; 

System.out.println(i); 

a=5; 

a=++a + ++a + a++; 

System.out.println(a); 

Это вычисляется:

i = (6, a is now 6) + (7, a is now 7) + (7, a is now 8) 

так я это 6 + 7 + 7 = 20 и так 20 печатается.

i = (5, a is now 6) + (7, a is now 8) + (8, a is now 9) 

поэтому i 5 + 7 + 8 = 20 и поэтому 20 снова напечатано.

a = (6, a is now 6) + (7, a is now 7) + (7, a is now 8) 

и после того, как все с правой стороны оценивается (в том числе установив до 8), то устанавливается на 6 + 7 + 7 = 20, и таким образом 20 распечатывается в последний раз.

10

В обоих случаях сначала вычисляет значение, но в пост-инкремент он держит старое значение и после расчета возвращений

++

  1. а = а + 1;
  2. возвращение a;

Темп A ++

  1. = а;
  2. a = a + 1;
  3. Температура возврата;
+3

Самый чистый ответ –

0

Я считаю, что вы выполняете все эти заявления по-разному
выполнение вместе приведет => 38, 29

int a=5,i; 
i=++a + ++a + a++; 
//this means i= 6+7+7=20 and when this result is stored in i, 
//then last *a* will be incremented <br> 
i=a++ + ++a + ++a; 
//this means i= 5+7+8=20 (this could be complicated, 
//but its working like this),<br> 
a=++a + ++a + a++; 
//as a is 6+7+7=20 (this is incremented like this) 
Смежные вопросы