| Autor |
Mensagem |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 14/01/2009 11:39:27
|
rmalati
Virtual Machine Man
![[Avatar]](/images/avatar/3bc8f7011e08bfe6830c967b497bdf6d.jpg)
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)" |
|
|
 |
|
|
![[Post New]](/templates/default/images/icon_minipost_new.gif) 14/01/2009 11:43:50
|
caio_ferreira
JavaTeenager
![[Avatar]](/images/avatar/714bb9ae1e0f98eab9dff4c8edaeb6f8.jpg)
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
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 14/01/2009 12:05:10
|
rmalati
Virtual Machine Man
![[Avatar]](/images/avatar/3bc8f7011e08bfe6830c967b497bdf6d.jpg)
Membro desde: 26/11/2007 09:10:30
Mensagens: 593
Localização: Jundiaí-SP
Offline
|
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)" |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 14/01/2009 13:20:09
|
douglas_vidotto
JavaGuru
![[Avatar]](/images/avatar/2b37aae16df6fc89dd503c3b2dfbf165.png)
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
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 14/01/2009 13:36:42
|
Nykolas Lima
Virtual Machine Man
![[Avatar]](/images/avatar/95f8fbf9e0653a1c0fee3572b5a25042.jpg)
Membro desde: 07/07/2008 13:10:41
Mensagens: 646
Offline
|
explicação muito boa, valeu
|
Blog: http://nykolaslima.wordpress.com |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 14/01/2009 15:04:22
|
rmalati
Virtual Machine Man
![[Avatar]](/images/avatar/3bc8f7011e08bfe6830c967b497bdf6d.jpg)
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)" |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 13/02/2010 23:38:59
|
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?
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 21/02/2010 14:56:34
|
evertonsilvagomesjava
JWizard
![[Avatar]](/images/avatar/6370988b46be58caec00d925d91d2f99.png)
Membro desde: 23/08/2009 13:14:01
Mensagens: 2012
Offline
|
Alguem ai tem uma explicação sobre a questao á cima?
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 21/02/2010 22:32:48
|
renzonuccitelli
GUJ Master
Membro desde: 17/09/2008 12:58:32
Mensagens: 1133
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/
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 22/02/2010 07:56:15
|
pmlm
GUJ Master
Membro desde: 20/04/2009 12:20:07
Mensagens: 1603
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.
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 22/02/2010 10:25:20
|
erickfm8
GUJ Master
Membro desde: 06/10/2009 19:29:12
Mensagens: 1454
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?
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 22/02/2010 11:16:26
|
pmlm
GUJ Master
Membro desde: 20/04/2009 12:20:07
Mensagens: 1603
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.
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 22/02/2010 13:44:53
|
erickfm8
GUJ Master
Membro desde: 06/10/2009 19:29:12
Mensagens: 1454
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
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 22/02/2010 14:17:40
|
pmlm
GUJ Master
Membro desde: 20/04/2009 12:20:07
Mensagens: 1603
Localização: Portugal
Offline
|
Se o problema está em porque não partir a expressão em partes mais pequenas, para melhor compreender?
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 22/02/2010 14:21:14
|
renzonuccitelli
GUJ Master
Membro desde: 17/09/2008 12:58:32
Mensagens: 1133
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/
|
|
|
 |
|
|