A execução de um programa C++ começa com a função main(). Em todos os exemplos que vimos até este momento, sentenças são executadas sequencialmente. A ordem sequencial de execução de senteças pode ser alterada se certas condições forem satisfeitas durante a execução do programa. Isto é chamado desvio condicional.
Todas as linguagens de programação oferecem comandos para o desvio condicional. O mais simples é a senteça if. Em C++ , ele tem o formato:
if ()
O corpo do desvio, por sua vez, pode ser uma sentença simples ou composta (veja Seção 1.1).
Quando uma sentença if é encontrada em um programa,
Considere o seguinte exemplo que converte uma fração digitada pelo usuário (numerador e denominador) em decimal e imprime o resultado:
#include <iostream> using namespace std; int main( ){ int a, b; cout << "Entre com uma fracao (numerador and denominador): "; cin >> a >> b; cout << "A fracao em decimal eh " << 1.0 * a / b << endl; }
No exemplo acima, escrevemos 1.0 * a / b, já que a e b são do tipo int, e portanto a / b é uma divisão de inteiros e a parte fracional do resultado seria truncado, o que certamente não é o que desejamos.
Voce vê algo errado neste programa ? Uma coisa a ser notada é que se o usuário digitar um denominador igual a 0, nós teremos um erro de execução, já que o programa tentaria executar uma divisão por zero. O que é necessário fazer é testar se o denominador é igual a zero e dividir só no caso dele for diferente de zero. Poderíamos reescrever o programa acima da seguinte forma:
#include <iostream> using namespace std; int main( ){ int a, b; cout << "Entre com uma fracao (numerador e denominador): "; cin >> a >> b; if (b != 0) cout << "A fracao em decimal eh " << 1.0 * a / b << endl; }
#include <iostream> using namespace std; int main( ){ int num1, num2, aux; cout << "Entre com dois numeros inteiros: "; cin >> num1 >> num2; if (num1 > num2) { aux = num1; num1 = num2; num2 = aux; cout << "Trocou \n"; } cout << "Os numeros ordenados: " << num1 << " " << num2 << endl; }
O programa do Exemplo 1 acima ficaria ainda melhor se ao invés de não fazer nada no caso do denominador ser zero, imprimirmos uma mensagem de erro ao usuário, explicando o que há de errado.
A sentença em C++ que permite fazermos isso é o if - else. O formato do if-else é:
if ()
else
Primeiro, a (que usualmente chamamos de condição) é
avaliada. Caso a condição seja verdadeira (o que é equivalente a dizer
que o valor é diferente de zero), entao a
é executada.
Caso contrário, a
é executada.
Note que uma sentença pode ser simples ou composta. Se você quiser agrupar diversas sentenças para serem executadas, você pode colocá-las entre chaves ({ e }).
Por hora, vamos continuar com nosso exemplo simples e torná-lo mais explicativo:
#include <iostream> using namespace std; int main( ){ int a, b; cout << "Entre com uma fracao (numerador and denominador): "; cin >> a >> b; if (b != 0) cout << "A fracao decimal eh " << 1.0 * a / b << endl; else cout << "Erro: denominador zero!\n"; }
#include <iostream> using namespace std; int main( ){ int num; // obtem um numero do usuario cout << "Entre com um inteiro: "; cin >> num; // imprime uma mensagem dizendo se o numero e par ou impar if (num % 2 == 0) cout << "O numero eh par.\n"; else cout << "O numero eh impar.\n"; }
É muito frequente utilizar o operador relacional == em expressões condicionais da sentença if. Por exemplo:
int saldo = 2000; if (saldo == 1) cout << "Voce esta quebrado! " << endl; else cout << "Seu saldo eh " << saldo << endl;
Como a sentença saldo = 2000 inicializa o valor da variável saldo com 2000, a expressão saldo == 1 tem valor 0. Portanto, a senteça que segue o else será executada, e a
mensagem
Seu saldo e 2000
será impressa.
Agora, suponha que, devido a um erro, você tenha colocado = ao invés de ==:
int saldo = 2000; if (saldo = 1) cout << "Voce esta quebrado! " << endl; else cout << "Seu saldo eh " << saldo << endl;
Agora, a expressão saldo = 1 tem valor 1. Portanto, a
sentença que segue o if será executada, e a mensagem
Voce esta quebrado!
será impressa. Além disso, a atribuição causará um efeito colateral, e alterará o valor de saldo para 1.
Tal uso do operador de atribuição não é ilegal, e não será detectado pelo compilador como erro. Portanto, tome cuidado com o uso de atribuição no lugar de igualdade. Tal erro é muito comum, e não é fácil de achar.
Como regra geral, NÃO utilize atribuições dentro de outras sentenças.