(Questão de prova SCJP 5) - Laço for maldoso e complicado

17 respostas
A

Laço for… questão de prova!

Ola pessoal, olha isso foi uma questao de prova de certificação.
Como sempre a SUN consegue deixar complexo ou difícil o que é simples/fácil.

O programa seguinte usa a simplicidade do laço for com retorno de método booleano e operador && para gerar algo complexo e que requer mais raciocínio e tempo do candidato, cuidado! Qual é a saída impressa?

Eu, assim como outros membros do forum "entendemos" mas como é que poderíamos explicar/interpretar esse programa?

public class Foo {
	static boolean foo(char c) {
		System.out.print(c);
		return true;
	}
	public static void main( String[] args) {
		int i = 0;
		for(foo('A'); foo('B')&&(i&lt2); foo('C')){
			i++ ;
			foo('D');
		}// ABDCBDCB
	}
}// Fim do programa.

Esse programa gera a saída:

ABDCBDCB

17 Respostas

A

nao entendi isso ’ i&lt2 ’ ??

Luca

Olá

Realmente os nomes que a Sun coloca nas classe e métodos são terríveis. São comuns classes e métodos chamados A, B, X, Foo, Bar.

O loop está claro e segue direitinho a ordem normal de execução. Mas na prática a gente evita escrever código igual a este loop.

[]s
Luca

A

eh o sinal de &lt (menor) = i&lt2

C

olá
ele inicializa o for, e imprime ‘A’;
testa a condição com (i=0), imprime ‘B’
entra no corpo do loop imprime ‘D’,incrementa i
imprime ‘C’
testa a condição com (i=1), imprime ‘B’
entra no corpo do loop imprime ‘D’, incrementa i
imprime ‘C’
testa a condição com (i=2), imprime ‘B’
fim

também não sabia que pode fazer isso com um for :slight_smile: :slight_smile:

marciosantri

Caramba! Tinha que prender o cara que colocou um negócio desses no teste…

i&lt2

O resto até que eu entendi, mas isso foi demais… Nunca tinha visto…

LPJava

putz…ainda bem que nao caiu muita questao na minha envolvendo… controle de fluxo. que eu lembre foi apenas 3 questoes… as demais so foi o mizerave dos threads!!

marcushlm

O resto até que eu entendi, mas isso foi demais… Nunca tinha visto…

questãozinha meio cruel mesmo…

neohacker

Nossa achei que aqui era o Fórum de Java Básico não era :?:

Achava que questões de certficação ficassem neste fórum http://www.guj.com.br/forums/show/11.java

Respeitem o Fórum :evil:

fabim

uma pergunta:

na expressao = foo(‘B’)&&(i<2)

o foo(‘B’) nao retorna sempre true?

esse operador &&, na primieira ocorrencia TRUE ele nao desconsidera o resto da expressao? o.O

ViniGodoy

neohacker:
Nossa achei que aqui era o Fórum de Java Básico não era :?:

Achava que questões de certficação ficassem neste fórum http://www.guj.com.br/forums/show/11.java

Respeitem o Fórum :evil:

8)

Na verdade, essa questão diz respeito ao java em si, então também cabe bem a esse forum. Ele não está perguntando do processo de certificação, mas da linguagem em si. Ele poderia ter visto um código desse no trabalho, que algum colega inspirado implementou…

Agora, meu comentário abaixo, deveria estar no outro forum, hehehehe.

O que eles querem avaliar com isso? Que o cara é capaz de entender código criptico? Que o for pode ser usado de uma maneira esdruxula? Que você pode tornar uma expressão condicional ilegível? Que o terceiro parâmetro do for não precisa necessariamente ser o contador? E o primeiro não precisa inicializar nada? E que o contador pode estar dentro do for?

Na prática, acho que qualquer programador com bom senso escreveria o código assim:

public static void main( String[] args) { foo('A'); for(int i = 0; i&lt2; i++) { foo('B'); foo('D'); foo('C'); } foo('B'); }

Acho que há maneiras mais lógicas e coerentes de testar se o candidato sabe ou não a ordem em que o for é executado, quando a avaliação da condição é feita, etc. Uma gambiarra dessa pode ser interessante para demonstrar isso visualmente, num livro de java, mas certamente não deveria estar numa prova de certificação.

Na minha opinião, isso é um uso possível do for, mas não deixa de ser um uso errado. A estrutura foi criada com uma finalidade clara, e tem 3 parâmetros cada um com um significado (inicialização, teste de condição, incrementos de variáveis). Ele simplesmente prostituiu isso, e esperava que o candidato soubesse fazer isso também.

E vamos falar a verdade, não é nem para preparar o candidato para uma situação dessas na prática. Pq na prática, temos depuradores, exceções e outros recursos para nos ajudar… E não estamos tão pressionados por tempo (ou preço) da prova…

Jonatas

Mas uma pergunta: isso caiu na prova ou está em algum simulado??
Pois há algo que no livro scjp fala que acho interessante: não é preciso saber de onde começa e termina os caracteres tibetanos.
Creio que esse é um caso que não precisamos ter conhecimento:

neohacker

ViniGodoy:
neohacker:
Nossa achei que aqui era o Fórum de Java Básico não era :?:

Achava que questões de certficação ficassem neste fórum http://www.guj.com.br/forums/show/11.java

Respeitem o Fórum :evil:

8)

Na verdade, essa questão diz respeito ao java em si, então também cabe bem a esse forum. Ele não está perguntando do processo, mas da linguagem em si. Ele poderia ter visto um código desse no trabalho, que algum colega inspirado implementou…

Agora, o que eles querem avaliar com isso? Que o cara é capaz de entender código criptico? Que o for pode ser usado de uma maneira esdruxula? Que você pode tornar uma expressão condicional ilegível?

Na prática, acho que qualquer programador com bom senso escreveria o código assim:

public static void main( String[] args) { foo('A'); for(int i = 0; i&lt2; i++) { foo('B'); foo('D'); foo('C'); } foo('B'); }

Acho que há maneiras mais lógicas e coerentes de testar se o candidato sabe ou não a ordem em que o for é executado, quando a avaliação da condição é feita, etc. Uma gambiarra dessa pode ser interessante para demonstrar isso visualmente, num livro de java, mas certamente não deveria estar numa prova de certificação.


Certo diz respeito a Java sim concerteza, tanto que a SCJP 5 é digamos que somente Java Básico, eu mesmo estudo pra tirar esta certificação, mas como ja vi vc msm diversas vezes para usarem nome de tópicos mais sugestivos, eu fico no Fórum de Java básico tentando ajudar muitas pessoas porque assim estou me ajudando, pois aprendo muito, mas se eu vejo um tópico com o nome de Questão de SCJP 5, pra que eu vou querer entrar, porque não postar em Certificação Java onde digamos o nível é mais “alto”.
Bem foi assim que pensei, eu to aqui tentando ajudar quem ta começando, quem não sabe muito, não estou afim de responder sobre questões de provas.
Posso estar errado mas pensei assim :slight_smile:

ViniGodoy

Não entendi, qual é a crise com o i&lt2?

Jonatas

fabiocsi:
uma pergunta:

na expressao = foo(‘B’)&&(i<2)

o foo(‘B’) nao retorna sempre true?

esse operador &&, na primieira ocorrencia TRUE ele nao desconsidera o resto da expressao? o.O


Isso seria válido se fosse ||, como é && ele não verifica o restante se fosse false.

fabim

SHIT!!!

malz ae viajei troquei os operadores :x

A

Pois é pessoal… é isso mesmo… a SUN de vez enquando nos surpreende com pérolas como essa…

é o que o vini falou… pra que tudo isso… há maneiras mais simples… acho que esse tipo de questão só atrasa a prova e depois vc fica sem tempo no final e é onde threads estão lhe esperando… e seus neuronios já o abandonaram…

… e outra coisa, dúvido que um programador use esse código do além no dia-a-dia, fala sério aí… a simplicidade é muito mais prática…e ninguém vai fazer doutorado em java…

acredito que tem muita coisa que poderia ser mais simples…

e nao estamos falando sobre certificação aqui… e sim sobre o fundamento básico que nesse caso foi o laço for como o vini falou… e esse código maluco ou foi bug no prgrama da prova ou os cafeinados da SUN pensam que como esses códigos sao comuns em HTML o pessoal do java deve saber…eu sabia pq ja trabalhei como webdesigner e tem uns códigos initeligiveis…mesmo…

mas eu acho que a idéia aki além de saber se vc veio de kripton :slight_smile: é saber se vc manda mesmo em laço for e suas partilaridades, operadores (&&, & etc), retorno e coisa e tal…

abraço a todos…e obrigaduuuuuuuu pelos comentários e ajuda… he he he h

elomarns

Já que o assunto é questões com código "um pouco menos legível" na SCJP, o que acham da questão abaixo:

O que acontecerá ao compilar e executar este código:

\u0070\u0075\u0062\u006C\u0069\u0063\u0020\u0063\u006C\u0061\u0073\u0073\u0020\u0051\u0075\u0065\u0073\u0074\u0061\u006F\u0046\u0061\u0063\u0069\u006C
\u007B
   \u0070\u0075\u0062\u006C\u0069\u0063\u0020\u0073\u0074\u0061\u0074\u0069\u0063\u0020\u0076\u006F\u0069\u0064\u0020\u006D\u0061\u0069\u006E\u0028\u0053\u0074\u0072\u0069\u006E\u0067\u005B\u005D\u0020\u0061\u0072\u0067\u0073\u0029
   \u007B
      \u0053\u0079\u0073\u0074\u0065\u006D\u002E\u006F\u0075\u0074\u002E\u0070\u0072\u0069\u006E\u0074\u006C\u006E\u0028\u0022\u0045\u0073\u0074\u0061\u0020\u0071\u0075\u0065\u0073\u0074\u0061\u006F\u0020\u0065\u0020\u0066\u0061\u0063\u0069\u006C\u0020\u0064\u0065\u006D\u0061\u0069\u0073\u0020\u0070\u0072\u0061\u0020\u0053\u0043\u004A\u0050\u002E\u0022\u0029\u003B
   \u007D
\u007D

Aos que tentarem, saibam que o código compila e executa sem problemas, desde que salvo em um arquivo-fonte com o nome adequado, já que se trata de uma classe pública, além disso, ele está indentado.

P.S.: Eu que escrevi este código lindo, afinal, esta questão é esdrúxula demais para cair em uma prova SCJP.

Criado 3 de maio de 2007
Ultima resposta 5 de mai. de 2007
Respostas 17
Participantes 12