Socorro !que livro estranho ?scjp 2 edicao sierra!?

ops…è verdade Matheus Tardivo touche!!
mas…
adiante tem um erro que nao se trata de má interpretacao veja a pagina 97 exercio 7 aqui realmente nao tem para onde ir, aresposta nao tem muito a var pois explica o pq vai dar errado mas nao a solucao!!!
e mais…
como tambem na pagina 116 quando fala de inicializar uma variável primitiva o exemplo que citei no começo do meu questionamento
pode pegar o livro e ver!
valeu!!

Sim Luiz_Gustavo,comeci lendo deitel java como programar mas pelo fato de abordar java com mais superficialidade nao considerei muito.Na verdade comprei esse livro scjp sierra pq muitas pessoas que passarm no exame o aconselharam e no livro deitel, pelo menos nao que lembri nao havia ficado com tantas dúvidas, mas é como te falei, o livro scjp trata o assunto com mais riqueza de detalhes entao pode errar mais!

Muito obrigado Veronicaaa ,é de novo verdade!!Me parece até estranho uma mulher dando conselhos em programacao java pois na minha facu só tem uma mulher na turma!Mas como dizem, quando vcs se interessam por um assunto conseguem realmente domina-lo!valeu!!

Exato!
Apesar de saber de pessoas que passaram na certificação estudando apenas pelo Deitel, ele não é um livro específico para a certificação.
O livro da kathy é mais focado em certificação, mostrando as “nhacas” das pegadinhas da linguagem.

[]'s

Legal Gustavo, entao vc que se garante…rs pq em java
y=0;
y=y++;
imprime 0??em c isso nao acontece ele atribui y para ele mesmo e esmo assim depois incrementa y=y=y+1;mas em java nao o resultado é zero!!!

ops na verdade era para vc a pergunta Gustavo!!foi mal!

Eu não tenho esse livro. Seria melhor você colocar aqui sua dúvida.

Quanto a isso, é outro erro de interpretação.
A variável x não é literal e nem constante. Dessa forma, o compilador não tem como garantir que essa variável será inicializada dentro do bloco condicional. Para verificar isso, vamos usar o seu exemplo:

[code]public static void main(String[] args) {
boolean x = true;

int n, y;

if (x == true) {
	n = 4;
}

System.out.println(n);

}[/code]
O compilador vai identificar um erro pois, como falei acima, x não é literal nem constante, por isso, para o compilador, n pode não ser inicializada antes de ser usada.

Se você modificar para:

[code]final boolean x = true;

int n, y;

if (x == true) {
n = 4;
}

System.out.println(n);[/code]
Agora x é uma “constante” (ou não pode ter seu valor alterado), então o compilador não acusa nenhum erro.

A mesma coisa irá acontecer se você alterar seu exemplo para:

[code]boolean x = true;

int n, y;

if (true) {
n = 4;
}

System.out.println(n);[/code]
Pois o bloco condicional tem apenas uma literal.

Enfim, recomendo o seguinte para você:

  • Ou você “acredita” mais no que o livro está dizendo e faz uma força extra no sentido de entender o que ele diz;
  • Ou, como o Luiz_Gustavo sugeriu, tente reforçar seus estudos com um livro mais didático (como este), para ensinar os fundamentos da linguagem, depois parta para um livro específico sobre certificação;

[quote=fabioEM]… pq em java
y=0;
y=y++;
…[/quote]
As operações de pré e pós incremento funcionam da mesma forma para Java e C (e tantas outras linguagens).
Em java:

int i = 0; System.out.println(i++);
Imprime 0.
Em C:

int i = 0; printf("%d", i++);
Imprime 0 também.
Isso porque a operação de pós-incremento primeiro avalia o valor da variável e depois faz a atribuição (i = i + 1).

Já com a operação de pré-incremento:
Em java:

int i = 0; System.out.println(++i);
Imprime 1.
Em C:

int i = 0; printf("%d", ++i);
Imprime 1 também.
Porque acontece o processo inverso, atribuição depois avaliação.

Veja a recomendação que coloquei no meu último post.

[quote=Matheus Tardivo][quote=fabioEM]… pq em java
y=0;
y=y++;
…[/quote]
As operações de pré e pós incremento funcionam da mesma forma para Java e C (e tantas outras linguagens).
Em java:

int i = 0; System.out.println(i++);
Imprime 0.
Em C:

int i = 0; printf("%d", i++);
Imprime 0 também.
Isso porque a operação de pós-incremento primeiro avalia o valor da variável e depois faz a atribuição (i = i + 1).

Já com a operação de pré-incremento:
Em java:

int i = 0; System.out.println(++i);
Imprime 1.
Em C:

int i = 0; printf("%d", ++i);
Imprime 1 também.
Porque acontece o processo inverso, atribuição depois avaliação.

Veja a recomendação que coloquei no meu último post.[/quote]

Isso é verdade, mas acho que o que o colega fabioEM quis dizer é diferente disso, veja bem ele não falou em y++; e sim y = y++;

É diferente, pois também testei no eclipse e realmente permanece zero, não importa quantas vezes você faça a atribuição ele sempre permanece zero, acho que o java atribui o valor de y (que é 0) a y e depois faz o incremento só que este não é atribuído a variável nenhuma. Parece que o incremento se perde!

Agora vc realmente explicou Matheus,e por sinal muito bem explicado.
Mas tem algumas partes que estao realmente mal esclarecidas defato vc mesmo explicou com auxilio de uma costante que não é mencionada no livro e nem deixado por subentendido.No exemplo que dei NAO disse que x era o valor literal mas que tinha que assumir o valor literal boolean em código fonte, defato segui ao pé letra o exemplo do livro, pois é assim que ele explica e nao com uma constante!!!
E se vc tivesse com o livro em maos poderia ver a pagina 97 ex 7!!assunto "construtores " ,neste caso a resposta esta sem lógica.
mas acho que vou seguir mesmo assim seu conselho vou depositar mais fé no livro pode ser que realmente vou ter que sempre associar estudos com consultas e verificacoes!!
valeu pela ajuda mesmo!!!

[quote=Veronicaaa][quote=Matheus Tardivo][quote=fabioEM]… pq em java
y=0;
y=y++;
…[/quote]
As operações de pré e pós incremento funcionam da mesma forma para Java e C (e tantas outras linguagens).
Em java:

int i = 0; System.out.println(i++);
Imprime 0.
Em C:

int i = 0; printf("%d", i++);
Imprime 0 também.
Isso porque a operação de pós-incremento primeiro avalia o valor da variável e depois faz a atribuição (i = i + 1).

Já com a operação de pré-incremento:
Em java:

int i = 0; System.out.println(++i);
Imprime 1.
Em C:

int i = 0; printf("%d", ++i);
Imprime 1 também.
Porque acontece o processo inverso, atribuição depois avaliação.

Veja a recomendação que coloquei no meu último post.[/quote]

Isso é verdade, mas acho que o que o colega fabioEM quis dizer é diferente disso, veja bem ele não falou em y++; e sim y = y++;

É diferente, pois também testei no eclipse e realmente permanece zero, não importa quantas vezes você faça a atribuição ele sempre permanece zero, acho que o java atribui o valor de y (que é 0) a y e depois faz o incremento só que este não é atribuído a variável nenhuma. Parece que o incremento se perde![/quote]

É!

muito interessante.

Alguem sabe explicar tecnicamente o q ocorre? Em detalhes baixo nível! :smiley:

[quote=Matheus Tardivo]
y=0;
y=y++;
As operações de pré e pós incremento funcionam da mesma forma para Java e C (e tantas outras linguagens).
…[/quote]

[quote=FabioEM]
y=0;
y=y++;
resultado é 0 em java mas em c é 1
…[/quote]

Noa!! se vc fizer essa operacao em c o resultado vai ser diferente amigo pode acreditar !!alguma coisa acontece!!

Iclusive Matheus Tardivo essa questao estava em um site italiano que mostra alguns textes parecidos com a prova scjp!!! um boa pegadinha que é fácil cair viu???rs…

Pois é Veronica bem observado!Realmente essa pegadinha de mal gosto acaba de fazendo nos reflectir que a linguagem java esconde alguns segredinhos!!Nao é??
um abraço!!

Acho que Gustavo sabe,ei Gustavo será que pelo menos tu sabes???
to ficando doido!
y=0;
y=y++;
imprime zero!! mas porque??? se em c imprime 1!!!

Realmente, neste caso, o funcionamento é um pouco diferente do que expliquei.
Ai já entra um elemento extra: ordem de avaliação dos operandos.

Mas essa dúvida já foi bastante discutida, inclusive aqui mesmo no GUJ.
http://www.guj.com.br/posts/list/2853.java
http://www.guj.com.br/posts/list/30723.java
http://www.javafree.org/javabb/viewtopic.jbb?t=11245
http://www.javafree.org/javabb/viewtopic.jbb?t=10563

Esse tipo de dúvida é apenas coisas de certificação (se bem que não me lembro de ter visto isso quando fiz a minha).
Não vejo porque alguém utilizaria uma atribuição dessas num caso real. :smiley:

[quote=fabioEM] Querido nadilsons,se nao fui educado foi pq achei a resposta um pouco ofensiva pois insinuar que é lógico nao é muito simpatico de fato simplismente estavo com uma dúvida e com gentileza perguntei para alguem esclarecer.Para explicar melhor te faço um exemplo,se vc me perguntar algo sobre um assunto que eu tenho amplo conhecimento e dominio mas percebo que tua pergunta é simples e muito banal nao vejo a razao pela qual te responder o quanto tu nao sabes?concorda amigo?
um abraco[/quote]

Cara, desculpe se o logico te ofendeu. Nao era essa minha intencao…de maneira alguma quero mostrar que sei mais do que vc ou qq outra.
Eu tenho que ter mais cuidado com meus posts pq esqueco que a pessoa nao esta “vendo minha expressao”…

Opa… tudo jóia?

Talvez eu possa colaborar…

class Test {
	public static void main(String[] args) {
		int i = 2;
		int j = (i=3) * i;
		System.out.println(j);
	}
}
class Test {
	public static void main(String[] args) {
		int a = 9;
		a += (a = 3);									// first example
		System.out.println(a);
		int b = 9;
		b = b + (b = 3);									// second example
		System.out.println(b);
	}
}

fonte: http://java.sun.com/docs/books/jls/second_edition/html/expressions.doc.html

class PrePostDemo {
     public static void main(String[] args){
          int i = 3;
	  i++;
	  System.out.println(i);	// "4"
	  ++i;			   
	  System.out.println(i);	// "5"
	  System.out.println(++i);	// "6"
	  System.out.println(i++);	// "6"
	  System.out.println(i);	// "7"
     }
}

fonte: http://java.sun.com/docs/books/tutorial/java/nutsandbolts/op1.html

acho que a questão toda está aqui:

Como o que prevalece na expressão é o valor da atribuição, e o pós incremento resulta no valor original, Y acaba sendo zero mesmo.

Caso alguém tenha uma visão diferente, ou outra explicação e queira compartilhar… por favor… para mim, até o momento, o motivo é esse.

abraços!

[editado]
Faltou a última fonte de referência!
[/editado]

[quote=Luiz_Gustavo][quote=fabioEM]

Legal Gustavo, entao vc que se garante…rs pq em java
y=0;
y=y++;
imprime 0??em c isso nao acontece ele atribui y para ele mesmo e esmo assim depois incrementa y=y=y+1;mas em java nao o resultado é zero!!!
[/quote]

Opa… tudo jóia?

Talvez eu possa colaborar…

class Test {
	public static void main(String[] args) {
		int i = 2;
		int j = (i=3) * i;
		System.out.println(j);
	}
}
class Test {
	public static void main(String[] args) {
		int a = 9;
		a += (a = 3);									// first example
		System.out.println(a);
		int b = 9;
		b = b + (b = 3);									// second example
		System.out.println(b);
	}
}

fonte: http://java.sun.com/docs/books/jls/second_edition/html/expressions.doc.html

class PrePostDemo {
     public static void main(String[] args){
          int i = 3;
	  i++;
	  System.out.println(i);	// "4"
	  ++i;			   
	  System.out.println(i);	// "5"
	  System.out.println(++i);	// "6"
	  System.out.println(i++);	// "6"
	  System.out.println(i);	// "7"
     }
}

fonte: http://java.sun.com/docs/books/tutorial/java/nutsandbolts/op1.html

acho que a questão toda está aqui:

Como o que prevalece na expressão é o valor da atribuição, e o pós incremento resulta no valor original, Y acaba sendo zero mesmo.

Caso alguém tenha uma visão diferente, ou outra explicação e queira compartilhar… por favor… para mim, até o momento, o motivo é esse.

abraços!

[editado]
Faltou a última fonte de referência!
[/editado][/quote]

Bom muitissssssssssssssimom obrigado meu amigo!!!

[quote=leofernandesmo][quote=fabioEM] Querido nadilsons,se nao fui educado foi pq achei a resposta um pouco ofensiva pois insinuar que é lógico nao é muito simpatico de fato simplismente estavo com uma dúvida e com gentileza perguntei para alguem esclarecer.Para explicar melhor te faço um exemplo,se vc me perguntar algo sobre um assunto que eu tenho amplo conhecimento e dominio mas percebo que tua pergunta é simples e muito banal nao vejo a razao pela qual te responder o quanto tu nao sabes?concorda amigo?
um abraco[/quote]

Cara, desculpe se o logico te ofendeu. Nao era essa minha intencao…de maneira alguma quero mostrar que sei mais do que vc ou qq outra.
Eu tenho que ter mais cuidado com meus posts pq esqueco que a pessoa nao esta “vendo minha expressao”…

[/quote]

Beleza meu amigo ,percebo que vc é um cara bem educado e camarada valeu!!!