18 março 2009

SCJP - 05 - Controle de Fluxo: ifs, switchs e loops

É, o capítulo 4 passou voando... E daqui a pouco eu vou precisar parar e fazer os exercícios, reler meus posts e fixar tudo o que eu li, afinal de contas, a gente já andou um bocado, não é verdade?



Comando IF

Em relação aos if's, eu acho que não tem quase nada a ser comentado. A não ser aquela velha dúvida que bate quando temos um if-else aninhado:

if (cond1)
if (cond2) ; // alguma coisa 
else ; // alguma outra coisa

A que if pertence o else? Essa é uma dúvida bastante comum, mesmo quando a gente termina as aulas de compiladores da faculdade. A resposta é aparentemente simples:

A cláusula else pertence ao if mais interno que ainda não tenha um else.

Fica mais fácil de entender se você seguir as "boas práticas": use sempre o par de chaves {}:

if (cond1) {
    if (cond2) {
        ; // alguma coisa
    } else {
        ; //alguma outra coisa
    }
}

Comando SWITCH


Quanto ao switch... Deixa eu ver... Já sabemos que aquilo que vai entre o par de parêntesis do comando deve ser um valor numérico (byte, short, int), um caractere (char), ou um enum. Erros de compilação ocorrem ao tentar usar um long, float ou double. Autoboxing também funciona aqui, ou seja, é válido usar Byte, Short, Integer e Character.

Atente para os tipos usados no switch e nos case's. Eles devem ser compatíveis. O seguinte código causa erro de compilação, por possível perda de precisão:

byte g = 1; 
switch(g) { 
    case 64:  
    case 128: 
}

O valor 128 já não é mais um byte (-128 a 127), não dá pra fazer um narrowing aqui... Repetir o mesmo valor para um outro case também gera erro de compilação.

O engraçado é que nós temos aquele modelo padrão de switch: os case, com um break ou não (depende só se você quiser que ele execute os case's seguintes em sequência - fall-through - ou não), e o default (ou não) no final. Se você manter em mente que os case's e o default do switch são apenas pontos de entrada para a execução do comando, você pode pensar em coisas como:

int x = 2; 
switch (x) { 
    case 2:  System.out.println("2"); 
    default: System.out.println("default"); 
    case 3:  System.out.println("3"); 
    case 4:  System.out.println("4"); 
}

Loops


Uma das coisas mais interessantes que eu vi sobre os loops em java é a maneira de sair de loops aninhados. Eu sempre lembro de Cláudia Gama (ex-professora de introdução à lógica de programação da UFBA) nas aulas de Pascal:

Não use GOTO!

loopDeFora:
for (algo;algo;algo) {
    for (algo;algo;algo){
        if (algo) {
            break loopDeFora;
        }
    }
}

A mesma coisa vale para o comando continue. E isso não é válido apenas para loops aninhados do mesmo tipo, também funcioina para combinações de for-while e while-for (tive preguiça de testar se funciona com os laços do tipo do)



Creative Commons License
Esta obra está licenciada sob uma Licença Creative Commons.
Comentários
0 Comentários

0 comments:

Postar um comentário

Regras são chatas, mas...

- Seu comentário precisa ter relação com o assunto do post;
- Em hipótese alguma faça propaganda de outros blogs ou sites;
- Não inclua links desnecessários no conteúdo do seu comentário;
- Se quiser deixar sua URL, comente usando a opção OpenID;
- CAIXA ALTA, miguxês ou erros de ortografia não serão tolerados;
- Ofensas pessoais, ameaças e xingamentos não são permitidos;