Qual o resultado e por quê?  XML
Índice dos Fóruns » Certificação Java
Autor Mensagem
Eliezer Reis
Java Ninja
[Avatar]
Membro desde: 23/04/2006 11:21:50
Mensagens: 291
Localização: Brasil
Offline



Não sei porque errei essa suposta simples questão. Pior que ainda estou sem saber.

[]'s Eliezer Reis
SCJP
SCWCD
[Email] [MSN]
_Roger_
What is classpath?
[Avatar]

Membro desde: 30/01/2009 13:31:33
Mensagens: 9
Offline

i=8 j=8 k=9 m=8 n=15



É isso?
erdanielli
Entusiasta Java
[Avatar]

Membro desde: 22/02/2009 16:46:23
Mensagens: 22
Localização: Maringá - PR
Offline

_Roger_ wrote:i=8 j=8 k=9 m=8 n=15
É isso?

Nâo, não é. Vou explicar:

Abraços!

This message was edited 1 time. Last update was at 26/02/2009 18:09:04


Eduardo Rebola Danielli
+ Bacharel em Ciência da Computação (UEM-PR)
+ SCJP 1.4
+ SCWCD 5
+ Certified ScrumMaster
http://eduardorebola.blogspot.com
[WWW] [MSN]
taaqui
JavaEvangelist
[Avatar]

Membro desde: 05/02/2008 12:25:07
Mensagens: 300
Localização: Rio de Janeiro
Offline

não entendi ainda.

This message was edited 2 times. Last update was at 26/02/2009 18:34:13


SCJP-SCWCD-SCBCD
[Email]
dfsilva86
JavaChild
[Avatar]

Membro desde: 13/01/2009 20:50:19
Mensagens: 123
Offline

Qual a dúvida?

Na última operação n "recebe temporariamente" o valor atual de i e depois o compilador decrementa i e soma mais um ao i quando terminar a operação.

Como os sinais de ++ vem depois da variável i, o compilador vai usar o valor atual dela e só vai incrementá-la depois que terminar a operação!

David Silva - Bacharelando em Sistemas de Informação
ITIL Foundation Certified
OCJP 6 - Estudando
[MSN]
fanama
JavaTeenager

Membro desde: 21/05/2007 16:32:57
Mensagens: 176
Localização: Socorro - SP
Offline

Vamos tentar outra vez:




1: i vale 8, certo?
2: j = 8 - Aqui ocorre que o "j" recebe o valor de "i" ( 8 ) e depois o "i" é incrementado atravéz do ++, passando a ser 9, certo? (i=9 e j=8 )
3: k = 10 - Aqui o pré incremento (++) adiciona 1 ao "i" e só depois atribui o valor de "i" ao "k", certo? (i=10, j=8 e k=10)
4: m=10 - Neste caso, como anteriormente, primeiro é atribuido ao "m" o valor de "i" e depois subtraido 1 de "i", OK? (i=9, j=8, k=10 e m=10)
5: n=19 - Aqui vamos por parte. Primeiro atribui o valor atual do "i" ( 9 ) ao "n" e acrescenta 1 (n=9 e i=10). Depois retira-se 1 de "i" (--i) (i=9 novamente) e soma-se com o que estava atribuído ao "n" ( 9+9=18 ).

i=9 j=8 k=10 m=10 n=18

Ficou claro?

Abraço

Marco A.

This message was edited 2 times. Last update was at 27/02/2009 05:41:08


"A boca fala do que está cheio o coração"
[Email] [MSN]
dfsilva86
JavaChild
[Avatar]

Membro desde: 13/01/2009 20:50:19
Mensagens: 123
Offline

Fica ainda mais claro se debugarem o exemplo.

David Silva - Bacharelando em Sistemas de Informação
ITIL Foundation Certified
OCJP 6 - Estudando
[MSN]
Eliezer Reis
Java Ninja
[Avatar]
Membro desde: 23/04/2006 11:21:50
Mensagens: 291
Localização: Brasil
Offline

Gente a dúvida principal está em saber porquê n será 18 uma vez que existe uma ordem de precedência nos sinais ai. Eu imagino que na linha 5(n = i++ + --i) a ordem logica de execução deveria ser:

A) executar a operação i++ (porém somaria 1 somente apos atribuir o valor da soma a N (operador =); logo i continuaria como 9;
b) executar a operação --i; logo i teria o novo valor de 8
c) executar a soma de 9+8
d) atribuir 17 a N;
e) no final da atribuição em N somar +1 a i referente a operação i++ do passo A; logo i voltaria a ser 9;

Não sei se cometi um erro de interpretação mas me recordo que a ordem de precedência é:
1) ++ e --
2) * /
3) + -
...
Ultimo) =


dfsilva86 wrote:Qual a dúvida?
Na última operação n "recebe temporariamente" o valor atual de i e depois o compilador decrementa i e soma mais um ao i quando terminar a operação.

Como os sinais de ++ vem depois da variável i, o compilador vai usar o valor atual dela e só vai incrementá-la depois que terminar a operação!


Isso não está claro. Tentando entender o quê você disse continuaria errado, afinal cai nos mesmos passos que citei acima.

fanana wrote:
n=19 - Aqui vamos por parte. Primeiro atribui o valor atual do "i" ( 9 ) ao "n" e acrescenta 1 (n=9 e i=10). Depois retira-se 1 de "i" (--i) (i=9 novamente) e soma-se com o que estava atribuído ao "n" ( 9+9=18 ).


Esse n=19 no inicio da linha vou entender como um erro de digitação. Quer dizer então que você atribuiu logo de inicio um valor a N e em seguida somou +1 a i sendo que isso não deveria ser praticamente os últimos passos?


Entendo que essa deve ser a explicação correta do problema, mas é um pouco estranho.

erdanielli wrote:
# // equivalente a: x = i + 1; y = i - 1; int n = x + y;
# // logo, x = 10, y = 8, n = 18, i = 9
# // x e y representam variaveis internas do compilador
# int n = i++ + --i;


Mas olha, no seu comentário x = i + 1 (usando o 10 para atribuir a N) é errado, senão seria verdade dizer que j = i++ é o mesmo que j = i +1, o que é errado.





[]'s Eliezer Reis
SCJP
SCWCD
[Email] [MSN]
dfsilva86
JavaChild
[Avatar]

Membro desde: 13/01/2009 20:50:19
Mensagens: 123
Offline

Como Funciona:

no exemplo nº 5 é usado operador pós-fixado e pré-fixado.



1º) O Compilador verifica que a variável i utiliza operador pós-fixado, ou seja ele vai usar o valor atual da variável...blz..ele pega o valor atual
2º) Ele identifica o operador + que ira fazer uma soma e encontra a variável j com operador pré-fixado, ou seja atualiza a variável j e depois utiliza seu valor, feito isso ele faz a soma e atribui a N.
3º) Terminada a expressão ele atualiza o valor de i que tem um operador pós-fixado

Ou seja, o operador pós-fixado será executado somente depois que terminar a expressão.

O Resultado será o mesmo se fizer:


ou


Sobre a ordem de precedência eu acho que vc está certo, mas na expressão nós temos apenas 1 operador para a expressão (+). Os demais são operadores pós e pré-fixados, não deixam de ser operadores mas são executados de forma diferente. Me corrijam se estiver falando besteira!!

Espero ter ajudado!

David Silva - Bacharelando em Sistemas de Informação
ITIL Foundation Certified
OCJP 6 - Estudando
[MSN]
Eliezer Reis
Java Ninja
[Avatar]
Membro desde: 23/04/2006 11:21:50
Mensagens: 291
Localização: Brasil
Offline

dfsilva86 wrote:
1º) O Compilador verifica que a variável i utiliza operador pós-fixado, ou seja ele vai usar o valor atual da variável...blz..ele pega o valor atual
2º) Ele identifica o operador + que ira fazer uma soma e encontra a variável j com operador pré-fixado, ou seja atualiza a variável j e depois utiliza seu valor, feito isso ele faz a soma e atribui a N.
3º) Terminada a expressão ele atualiza o valor de i que tem um operador pós-fixado

Ou seja, o operador pós-fixado será executado somente depois que terminar a expressão.


Mais então maluco, executando seus passos olha como deveria ficar:

1) i = 9
n = 9 + --i

2) n = 9 + 8
n = 17

3) i = 9

Reparou? O que você diz é o mesmo que está ai. O RESULTADO correto é 18 para N.

This message was edited 1 time. Last update was at 27/02/2009 11:48:18


[]'s Eliezer Reis
SCJP
SCWCD
[Email] [MSN]
dfsilva86
JavaChild
[Avatar]

Membro desde: 13/01/2009 20:50:19
Mensagens: 123
Offline

Entendi o que vc disse!! você está certo...

Então a questão são os operadores pós e pré fixados, vamos lá de novo.

O que eu entendi com o debug:
1º) Ele faz a soma com os valores atuais de "i"
2º) Ele incrementa e depois decrementa resultando i em 9 e n em 18!!! conforme a ordem de precedencia....

Eu acho que é isso, mas agora fiquei mais confuso:

Se fizer assim: i=10 e n=19


Se fizer assim: i=8 e n=17


Vou estudar mais esses operadores!!!






David Silva - Bacharelando em Sistemas de Informação
ITIL Foundation Certified
OCJP 6 - Estudando
[MSN]
rodrigo.bossini
GUJ Master
[Avatar]

Membro desde: 01/07/2008 20:59:17
Mensagens: 1055
Offline

Essa questão é de algum simulado?

http://www.rodrigobossini.com.br/

Meu Twitter:@rodrigobossini
Se uma pessoa fala português há 30 anos e ainda não aprendeu, por que é que vou acreditar que ela está programando em alguma linguagem de programação há apenas 10 anos e sabe o que está fazendo?
Eliezer Reis
Java Ninja
[Avatar]
Membro desde: 23/04/2006 11:21:50
Mensagens: 291
Localização: Brasil
Offline

Na verdade não. Estava lendo um livro sobre estrutura de dados para aprender conceitos mais avançados de arvores e me deparei com esse treixo de código que fiquei com tremenda dúvida. Dai achei muito parecido com essas questões de prova de certificação, por isso postei aqui.

Mas ainda não achei uma boa explicação para isto.

Até.

[]'s Eliezer Reis
SCJP
SCWCD
[Email] [MSN]
 
Índice dos Fóruns » Certificação Java
Ir para:   
Powered by JForum 2.1.8 © JForum Team