Como os operadores pós-incremento (i ++) e pré-incremento (++ i) funcionam em Java?


99

Você pode me explicar a saída deste código 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);

A saída é 20 em ambos os casos


9
Sempre evite declarações ambíguas :)
— Prasoon Saurav

9
@Prasoon Saurav Ao contrário de C e C ++, Java e C # têm ordem de avaliação estritamente definida, portanto, essas instruções não são ambíguas.
— Pete Kirkham

12
Eu sei disso, mas mesmo assim essas declarações não são (não podem ser) usadas para fins práticos, portanto, deve-se evitá-las.
— Prasoon Saurav


4
@PeteKirkham Já se passaram mais de seis anos, mas ainda quero salientar que "ambíguo", nesta situação, é ambíguo - pode significar "o compilador não sabe o que colocar", ou pode significar "O programador não tem ideia do que significa ".
— Ação judicial de Monica, em

Respostas:


150

Isso ajuda?

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

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

O ponto principal é que ++aincrementa o valor e o retorna imediatamente.

a++ também incrementa o valor (no fundo), mas retorna o valor inalterado da variável - o que parece ser executado mais tarde.


5
Tem certeza que a == 9 no segundo?
— Pete Kirkham,

1
i = ++ a + ++ a + a ++; => i = 7 + 8 + 5; (a = 8) uma vez que o incremento posterior tem a precedência mais alta, um ++ é executado primeiro?
— rsirs de

2
exemplo complicado para algo que é fácil de explicar.
— oznus

Esta resposta é a mesma para c # e c ++?
— workoverflow

Por que a, b e c são iguais a 2 aqui? int a = 1; int b = a++; int c = ++b;Esperava-se que b fosse 1, pois é um incremento posterior.
— Dennis

202

++aincrementos e então usa a variável.
a++usa e então incrementa a variável.

Se você tem

a = 1;

e você faz

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

//Now a is 2

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

codaddict explica seu trecho específico.


62

Em ambos os casos, primeiro calcula o valor, mas no pós-incremento mantém o valor antigo e após o cálculo o retorna

++ a

  1. a = a + 1;
  2. return a;

a ++

  1. temp = a;
  2. a = a + 1;
  3. return temp;

8
Resposta mais clara
— Kartik Chugh

2
este foi o único que me fez entender claramente .. obrigado.
— rematnarab

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

é

i = 6 + 7 + 7

Trabalhando : incremento de a a 6 (valor atual 6) + incremento de a a 7 (valor atual 7). A soma é 13, agora adicione-o ao valor atual de a (= 7) e, em seguida, aumente a para 8. A soma é 20 e o valor de a após a conclusão da atribuição é 8.

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

é

i = 5 + 7 + 8

Funcionando : No valor inicial de a é 5. Use-o na adição e aumente-o para 6 (valor atual 6). Incremente a do valor atual 6 para 7 para obter outro operando de +. A soma é 12 e o valor atual de a é 7. Em seguida, incremente a de 7 para 8 (valor atual = 8) e adicione-o à soma anterior 12 para obter 20.


essas declarações funcionam da direita para a esquerda ou da esquerda para a direita?
— Abhijeet

10

++aincrementos aantes de ser avaliado. a++avalia ae então o incrementa.

Relacionado à sua expressão dada:

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

Os parênteses que usei acima são usados ​​implicitamente por Java. Se você olhar para os termos desta forma, você pode facilmente ver que eles são iguais e comutativos.


1
@ KlasLindbäck comutativo significa que você pode trocar ambas as expressões e ainda obter o mesmo resultado. Portanto, a ++ + ++ a == ++ a + a ++ (5 + 7 == 6 + 6; a == 7 no final).
— Aurril de

8

No exemplo acima

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

4

++ a é operador de incremento de prefixo:

  • o resultado é calculado e armazenado primeiro,
  • então a variável é usada.

a ++ é um operador de incremento postfix:

  • a variável é usada primeiro,
  • então o resultado é calculado e armazenado.

Depois de lembrar as regras, EZ para você calcular tudo!


4

Presumindo que você quis dizer

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

Isso avalia:

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

então i é 6 + 7 + 7 = 20 e então 20 é impresso.

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

então i é 5 + 7 + 8 = 20 e então 20 é impresso novamente.

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

e depois que todo o lado direito é avaliado (incluindo a definição de a para 8) ENTÃO a é definido para 6 + 7 + 7 = 20 e assim 20 é impresso uma última vez.


3

quando aé 5, então a++dá 5 à expressão e incrementa adepois, enquanto ++aincrementa aantes de passar o número para a expressão (o que dá a6 para a expressão neste caso).

Então você calcula

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

3

Acredito, entretanto, que se você combinar todas as suas instruções e executá-las no Java 8.1, obterá uma resposta diferente, pelo menos é o que diz minha experiência.

O código funcionará assim:

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

3

Pré-incremento significa que a variável é incrementada ANTES de ser avaliada na expressão. Pós-incremento significa que a variável é incrementada DEPOIS de ter sido avaliada para uso na expressão.

Portanto, observe cuidadosamente e verá que todas as três atribuições são aritmeticamente equivalentes.


2

pré-incremento e pós-incremento são equivalentes se não em uma expressão

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

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

é

i = 7 + 6 + 7

Funcionando: o pré / pós incremento tem associatividade da "direita para a esquerda", e o pré tem precedência sobre o pós, então antes de mais nada o pré-incremento será resolvido como (++a + ++a) => 7 + 6. então a=7é fornecido para postar incremento => 7 + 6 + 7 =20e a =8.

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

é

i=7 + 7 + 6

Trabalhando: pré / pós incremento tem "direita para a esquerda" Associatividade e pre tem precedência sobre post, então em primeiro lugar pré incremento será resolver como (++a + ++a) => 7 + 6.then a=7é fornecido para incremento post => 7 + 7 + 6 =20e a =8.


0

Eu acredito que você está executando todas essas instruções de forma diferente,
executando em conjunto resultará em => 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)
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.