# Java/Comandos de seleção

Como pode-se notar, o conhecimento adquirido até aqui não permite a criação de programas interativos. Eles sempre executam da mesma forma, independente do que o usuário faz ou dos valores que são recebidos. Mas agora iremos aprender a usar alguns comandos que permitem que dependendo das circunstâncias, os programas executem instruções diferentes.

## A instrução if

A instrução de seleção única if, também conhecida por if-then, possibilita a execução condicional de um bloco de instruções.
Depois da palavra-chave if é necessária uma expressão booleana entre parênteses. Caso a expressão booleana resulte no valor true em tempo de execução então o bloco seguinte será executado, caso resulte em false aquele será ignorado. O bloco de instruções pode conter 0 ou mais instruções. As chaves que delimitam o bloco são opcionais caso se tenha apenas uma instrução a ser executada.

## A instrução if...else

Também conhecida como instrução if-then-else, a instrução de seleção dupla if...else tem função complementar à de if: executa instruções no caso da expressão booleana de if resultar em false.
A palavra chave else deve estar logo após da(s) instrução(ões) de if. Após a palavra chave else deve ser colocado o bloco de instruções a serem executadas no caso da expressão booleana de if resultar em false. Assim como if, as chaves delimitadoras de bloco são opcionais caso haja apenas uma instrução a executar.

## Instruções if...else aninhadas

As instruções if ou if...else podem ser aninhadas dentro de outras instruções if ou if...else para casos em que antes de determinadas instruções serem executadas sejam necessárias combinações de resultados de expressões booleanas.
As instruções if e if...else aninhadas não apresentam nenhum comportamento diferente do esperado caso não estivessem aninhadas. Estão sendo abordadas apenas com o intuito de exemplificar a possibilidade de aumento das ramificações de decisões.
É possível verificar no exemplo acima que a primeira instrução if mesmo contendo mais de uma linha de instruções consegue identificar que o if...else forma uma única ramificação e assim executar a expressão booleana normalmente. Isso se deve ao fato que toda else está vinculada a uma if. Já na else com o escopo mais externo, verifica-se chaves delimitadoras de bloco. Essas chaves são necessárias por conta de uma segunda instrução, nomeadamente System.out.println, que é executada independentemente do resultado da expressão booleana da if...else.
No exemplo acima há um recurso estilístico para indentar o código com a finalidade de aprimorar a legibilidade. As palavras chave if foram anexadas às palavras chave else já que as else têm somente uma instrução cada e por isso não necessitam de chaves para delimitar bloco de instruções. O código abaixo tem exatamente a mesma funcionalidade apesar das quebras de linha.

## A instrução switch

A instrução switch por vezes chamada de switch...case possibilita a execução condicional de instruções de acordo com a correspondência entre a expressão avaliada e a constante em case.
Dentro do parâmetro da switch pode ser utilizada expressão que resulte em: byte, short, char, int, String e enum. As chaves que delimitam o bloco são necessárias ainda que só haja uma ramificação do fluxo do código. A palavra chave case indica as ramificações de código. Deve ser seguida de uma expressão constante que corresponda ao tipo da expressão inserida no parâmetro da switch, e essa expressão constante, por sua vez, deve ser seguida de : que é o carácter que delimita o início do bloco de instruções relativo à case. Após : podem ser inseridas 0 ou mais instruções, incluindo a palavra chave break que será abordada mais adiante. Ao iniciar outra instrução case ou inserir a chave de fechamento do bloco de switch o bloco anterior é encerrado.
Em tempo de execução, a variável dia será comparada com as expressões constantes, definidas em tempo de compilação, de cada case. O case contendo o valor 5 tem valor igual ao da variável dia, então desse ponto em diante todas as instruções serão executadas até que chegue o término do bloco de switch.

### A instrução break

Caso seja necessário que apenas sejam executadas instruções vinculadas a determinadas case então deve-se utilizar a instrução break. Após a instrução break o fluxo do programa sai do bloco de switch.
Com a instrução break inserida no bloco da case com valor sexta, o código será executado da case com valor 5 até essa break referida.

### A instrução default

A instrução default pode ser utilizada para o caso da expressão no parâmetro de switch não corresponder a nenhum dos valores das instruções case. default pode aparecer em qualquer ordem e segue o mesmo funcionamento que case no que tange a bloco de instruções e uso de break.

## Exercícios

Dado o código acima, responda:
1. O que será impresso na tela? A afirmação está correta? :
* Será exibido a é menor que 2. porém a informação está incorreta. A instrução else está vinculada a if imediatamente anterior, e no parâmetro dessa if a expressão booleana resultará false. Logo, a informação correta seria a é maior ou igual a 4..
2. Como corrigir o código? :
* int a = 5;
* if (a > 2) {
* if (a < 4)
* System.out.println("a é igual a 3.");
* } else
* System.out.println("a é menor ou igual a 2.");
Dado o código acima, responda:
3. Remova o código desnecessário, defina blocos de instruções para todas as instruções if...else e indente. :
* A última expressão booleana (b < c) não é necessária pois caso um número b não seja maior ou igual a um número c, obviamente ele será menor.
* double b = 10.5;
* double c = 2.0;
* if (b == c) {
* System.out.println("b é igual a c");
* } else {
* if (b > c) {
* System.out.println("b é maior que c");
* } else {
* System.out.println("b é menor que c");