Uma coleção de resumos, para ajudar os que precisam daquele empurrão.
O if (bem como o if else) é usado para executar código com base numa condição lógica.
Tanto como if e o if else estão presentes em C.
Separamos o if nestes dois casos pois, ao contrário do Haskell por exemplo, um if não tem que ser seguido por um else.
O if em si tem dois casos.
if se verifique;if se verifique.if(condição){
linhaDeCodigo1;
linhaDeCodigo2;
}
Vamos ver alguns exemplos:
int x = 4;
int y = 0;
if(x==4){
x += 3; // x = x + 3
y--; // y = y - 1
}
Qual é o valor do x e do y?
X tem valor 7
Y tem valor -1
Como o if tem chavetas e como x==4 é verdadeiro, as duas linhas de código são executadas.
Sem chavetas:
int x = 4;
int y = 0;
if(x==0) // mudou a condição!
// não temos { }
x += 3; // x = x + 3
y--; // y = y - 1
Qual é o valor do x e do y?
X tem valor 4
Y tem valor -1
Como o if não tem chavetas a unica linha de código condicionada pelo if é x += 3;.
Visto que x == 0é falso, x += 3; nunca corre!
De facto, o código como está escrito não é muito simpático para a leitura. Podia, E DEVIA, ser melhorado através de indentação e/ou { }, apesar destas não serem precisas.
int x = 4;
int y = 0;
if(x==0)
x += 3; // não fica mais obvio que é afectado pelo if?
y--; // y = y - 1
Melhor ainda…
int x = 4;
int y = 0;
if(x==0){
x += 3;
}
y--; // y = y - 1
Recomendamos então usarem sempre chavetas mesmo sendo estas redundantes. Numa fase incial é a melhor estratégia. Se não colocarmos chavetas e mais tarde adicionarmos codigo dentro do if, podemos nos esquecer destas e o código não faz o que esperamos. É um dos tipos de erros mais dificil de detetar (falo por experiência!).
Vamos acrescentar o else agora. Este indica um bloco de código que irá executar sempre que a condição do if for falsa.
int x = 4;
int y = 0;
if(x==0)
x += 3; // x = x + 3
else
y--; // y = y - 1
Qual é o valor do x e do y?
X tem valor 4
Y tem valor -1
Tal como o if, o else pode ser seguido de chavetas e as mesma regras se aplicam.
Quando é seguido de chavetas, corre esse bloco do código.
Quando não é seguido de chavetas corre apenas uma linha.
int x = 4;
int y = 0;
if(x==0){
x += 3; // x = x + 3
}else{
y--; // y = y - 1
x--;
}
// ou
if(x==0){
x += 3; // x = x + 3
}
else{
y--; // y = y - 1
x--;
}
O estilo das chavetas é puramente pessoal, dentro dos limites da sanidade mental.
Uma estrutura de controlo que resulta da composição das duas anteriores é o else if.
Se quisermos implementar um menu teremos de tomar uma decisão diferente conforme a opção que o utilizador escolher.
void menu(char opcao){
if(opcao == 'Y'){
yes();
}else if(opcao == 'N'){
nao();
}else{
reset();
}
}
Este codigo é equivalente ao seguinte.
void menu(char opcao){
if(opcao == 'Y'){
yes();
}
if(opcao == 'N'){
nao();
}
if(opcao != 'Y' && opcao != 'N'){
reset();
}
}
Mas este é muito mais chato de escrever e de ler. E caso o nosso menu tenha 10 opções diferentes a condição do ultimo if irá ser gigantesca.
Para além disso, o segundo excerto de codigo é menos eficiente, visto que o nosso codigo fará muitas mais comparações. Enquanto que no 1º excerto se a condição do
primeiro if for verdadeira apenas o corpo deste é executado. Por outro lado, no 2º excerto, apesar de já termos entrado no primeiro if o computador vai ter de
fazer todas as outras comparações.
### Operador ternário
Existe uma forma de escrever um if else de forma mais concisa mas à custa de perda de legibilidade.
condição ? operaçãoCasoSejaVerdade : operaçãoCasoSejaFalso;
Vamos tentar entender melhor com um exemplo
int x = 4;
x > 4 ? x = 1 : x = 0;
/* É o equivalente a fazer
if(x > 4){
x = 1;
}else{
x = 0;
}
*/