Dúvida sobre operadores de Pós/Pré-Incremento/Decremento  XML
Índice dos Fóruns » Certificação Java
Autor Mensagem
rmalati
Virtual Machine Man
[Avatar]

Membro desde: 26/11/2007 09:10:30
Mensagens: 593
Localização: Jundiaí-SP
Offline

Pessoal, ontem fazendo o simulado Whizlabs me deparei uma questão que envolvia pós/pré-incremento/decremento.
Bati o olho e me parecia muito simples, pois sabendo que o operador pós-incremento/decremento altera o valor após o uso e que o operador de pré-incremento/decremento altera o valor antes de seu uso. Entretanto, errei esta questão pois nela havia o uso da mesma variável duas vezes em uma expressão e o resultado neste caso foi completamente diferente do que eu esperava, e ainda não consegui entender.
Fiz alguns testes, e gostaria que se alguém souber o motivo e a lógica aplicada nestas situações me explique por favor.

Segue o código de exemplo:


Rodrigo Malatesta Barbosa
Graduando em Tecnologia Informática Unicamp
SCJP 1.6 - 93%

"A disciplina é o caminho mais curto para o sucesso"
"Se não puder destacar pelo talento, vença pelo esforço. (Provérbio indiano)"
[Email] [MSN]
caio_ferreira
JavaTeenager
[Avatar]

Membro desde: 21/02/2008 09:25:40
Mensagens: 189
Localização: São Caetano do Sul - SP
Offline

talvez ajude a entender
http://www.guj.com.br/posts/list/2853.java#13818

Graduado em Ciência da Computação
Oracle Certified Java Programmer 5




[MSN]
rmalati
Virtual Machine Man
[Avatar]

Membro desde: 26/11/2007 09:10:30
Mensagens: 593
Localização: Jundiaí-SP
Offline

billcaio wrote:talvez ajude a entender
http://www.guj.com.br/posts/list/2853.java#13818


Nossa, dei uma passada rápida.. parece uma questão bem polêmica.
Obrigado.

Rodrigo Malatesta Barbosa
Graduando em Tecnologia Informática Unicamp
SCJP 1.6 - 93%

"A disciplina é o caminho mais curto para o sucesso"
"Se não puder destacar pelo talento, vença pelo esforço. (Provérbio indiano)"
[Email] [MSN]
douglas_vidotto
JavaGuru
[Avatar]

Membro desde: 12/08/2008 15:43:18
Mensagens: 208
Offline

Vamos supor que você tenha o seguinte:

a = 0;
a = a++;

Enquanto você nao usar o "a" novamente ele continuará valendo 0. Assim, quando temos uma situação do tipo
b = a++ + a; você pode tentar fazer assim, leia da esquerda para a direita para ficar mais facil. Começando com a++. Por enquanto o "a" vale 0 já que ele ainda não apareceu de novo. Continue lendo. Aparece um outro "a". Este "a" vai ser igual a 1, pois recebeu +1 do pos incremento anterior. Depois que você sabe todos os valores da expressão temos: b = 0 + 1, portanto b = 1.

Quando você tem expressoes do tipo

a = 0;
b = 0;

b = ++a + a;

Leia da esquerda para a direita também, procurando o valor dos fatores da expressão. Primeiro fator: ++a, portanto aí o "a" é igual a 1 pois temos um pré-incremento. O segundo fator é um outro "a" que vale 1 pelo pré-incremento da primeira expressão. Portanto temos b = 1 + 1 = 2.


Vendo caso por caso fica assim:

Primeiro caso


Segundo caso:


Terceiro caso:


Quarto caso


Os outros casos acho que são mais fáceis de enxergar.

Eu penei pra chegar na resposta também, mas depois que passei a ver da forma como te mostrei acima, consegui a resposta bem mais fácil. Espero ter ajudado

Abraços
Nykolas Lima
Virtual Machine Man
[Avatar]

Membro desde: 07/07/2008 13:10:41
Mensagens: 666
Offline

explicação muito boa, valeu

Blog: http://nykolaslima.wordpress.com
[WWW]
rmalati
Virtual Machine Man
[Avatar]

Membro desde: 26/11/2007 09:10:30
Mensagens: 593
Localização: Jundiaí-SP
Offline

douglas_vidotto, cara vc mandou benzaço na sua resposta.
Agora eu entendi perfeitamente, era isto mesmo que eu queria, encontrar alguma lógica nesse código que não me parecia racional.
Vou dar uma praticada, mas tenho certeza que não vou mais me atrapalhar.

Muito obrigado mesmo!!!!

Rodrigo Malatesta Barbosa
Graduando em Tecnologia Informática Unicamp
SCJP 1.6 - 93%

"A disciplina é o caminho mais curto para o sucesso"
"Se não puder destacar pelo talento, vença pelo esforço. (Provérbio indiano)"
[Email] [MSN]
danilolf
Smalltalk

Membro desde: 13/02/2010 23:37:23
Mensagens: 1
Offline

E esse caso, alguém pode explicar?

public class Incremento {
public static void main(String[] args){
int j = 0;
for (int i = 0; i < 100; i++) {
j = j++;
System.out.println(j);
}
System.out.println(j);
}
}

A cada iteração o j seria referenciado novamente, então deveria haver o incremento, não?
evertonsilvagomesjava
JWizard
[Avatar]

Membro desde: 23/08/2009 13:14:01
Mensagens: 2035
Offline

Alguem ai tem uma explicação sobre a questao á cima?
renzonuccitelli
GUJ Master

Membro desde: 17/09/2008 12:58:32
Mensagens: 1134
Offline

Eu uso a mesma lógica do que acontecia em C. Se não me engano, compilador troca ++i por i=i+1, e i++ por i=i, i=i+1. Aí é só utilizar essa lógica que fica explicado o print(j) dentro do laço. Por isso meu professor até brincava que era boa prática colocar sempre pré-incremento.
[]s

Renzo Nuccitelli

Engenheiro de Computação - ITA

http://nuccitec.com.br/
http://blog.nuccitec.com.br/
http://jcoltrane.sf.net
http://jfera.nuccitec.com.br/
http://code.google.com/p/webapp-ce/
pmlm
GUJ Master

Membro desde: 20/04/2009 12:20:07
Mensagens: 1700
Localização: Portugal
Offline

danilolf wrote:


Como isso é uma atribuição, vai ser efectuada a parte direita do igual (j++), então o que é feito é guardar o valor de j para usar na expressão (0), e incrementado j (1). Como essa parte fica tratada, vai ser atribuído a j o valor da expressão (lembra-te que tinha sido guardado o 0 para usar na expressão, daí j ficar com 0. E isto se repete em todo o ciclo, incrementa mas depois sobrepõe o valor com 0.


renzonuccitelli wrote:Por isso meu professor até brincava que era boa prática colocar sempre pré-incremento.

Desde que se saiba como funciona o que estás a usar, tanto podes utilizar pré como pós-incremento.
erickfm8
GUJ Master

Membro desde: 06/10/2009 19:29:12
Mensagens: 1460
Offline

Pessoal desculpe entrar de intrometido aqui , mais é que essa questão me gerou uma duvida

Douglas não intendi o 3 caso



pensa comigo b= ++a + a++ 'a' recebe preincremento de 'a' que vale 1 + o posincremente de 'a' que no momento vale 0 pois não incremento nada ainda, ele só ira incremente quando usar o 'a' novamente , nesse caso nos não estamos usando o 'a' novamente. Então era para fica b = 1 + 0 resposta 1

alguem tem alguma outra logica para isso?

Bacharel em Sistema de Informação
OCJP
OCWCD
OCEEJBD
pmlm
GUJ Master

Membro desde: 20/04/2009 12:20:07
Mensagens: 1700
Localização: Portugal
Offline

erickfm8 wrote: nesse caso nos não estamos usando o 'a' novamente?

O teu erro está aqui. Neste caso estás a usar o a novamente. Está na mesma linha mas é uma utilização diferente.

++a --> fica 1 em a e usa 1 na expressão
a++ --> usa 1 na expressão (que tinha sido incrementado na anterior) e fica 2 em a.

erickfm8
GUJ Master

Membro desde: 06/10/2009 19:29:12
Mensagens: 1460
Offline

O teu erro está aqui. Neste caso estás a usar o a novamente. Está na mesma linha mas é uma utilização diferente.

++a --> fica 1 em a e usa 1 na expressão
a++ --> usa 1 na expressão (que tinha sido incrementado na anterior) e fica 2 em a.


mais aqui a++ nos estamos apenas acionando o pós incrmento, estamos usando apenas para acionar o pos incremento, ai na proxima vez que nós fomos usar que teria que incrementar não é? pois usando o raciocionio de que ele faz o pos encremeto e so incrementa quando fomos usar novamente, não intendo essa logica

Bacharel em Sistema de Informação
OCJP
OCWCD
OCEEJBD
pmlm
GUJ Master

Membro desde: 20/04/2009 12:20:07
Mensagens: 1700
Localização: Portugal
Offline

Se o problema está em porque não partir a expressão em partes mais pequenas, para melhor compreender?

renzonuccitelli
GUJ Master

Membro desde: 17/09/2008 12:58:32
Mensagens: 1134
Offline

erickfm8 wrote:Pessoal desculpe entrar de intrometido aqui , mais é que essa questão me gerou uma duvida

Douglas não intendi o 3 caso





pensa comigo b= ++a + a++ 'a' recebe preincremento de 'a' que vale 1 + o posincremente de 'a' que no momento vale 0 pois não incremento nada ainda, ele só ira incremente quando usar o 'a' novamente , nesse caso nos não estamos usando o 'a' novamente. Então era para fica b = 1 + 0 resposta 1

alguem tem alguma outra logica para isso?


Já coloquei outra lógica no meu post anterior.

na 3: b= (a=a+1) + (a=a), a=a+1;

Renzo Nuccitelli

Engenheiro de Computação - ITA

http://nuccitec.com.br/
http://blog.nuccitec.com.br/
http://jcoltrane.sf.net
http://jfera.nuccitec.com.br/
http://code.google.com/p/webapp-ce/
 
Índice dos Fóruns » Certificação Java
Ir para:   
Powered by JForum 2.1.8 © JForum Team