# Controle de fluxo em C++

Aqui vamos criar funções que nos permitam alterar a leitura de execução do código. Ou seja, já dissemos que a leitura de execução do código é de cima para baixo (lê a primeira linha de código – executa, lê a 2ª linha --- executa,..e por aí adiante)
O que agora vamos fazer e criar mecanismos para alterar esse leitura sequencial e permitir:
* Execução de código de acordo com a condição
* Repetição de execução de código sujeito a condição
* Saltar linhas de código

## Decisão em C++

Em C++ os métodos de tomada de decisão presentes na linguagem C estão disponíveis para as tarefas mais corriqueiras que o programa deve executar. Além desta forma de controle de decisões, C++ provê certas funcionalidades relacionadas a objetos que modificam a forma como o código é estruturado e, por consequência, decidem como o programa deve se comportar em determinadas situações. Examinemos os métodos básicos e analisemos de forma simples as estruturas de decisão presentes no modelo de programação orientado a objetos, para entender como isso poderá nos ajudar a tornar o código mais bem construído.
De modo geral, a maioria das linguagens de programação existentes utiliza-se das estruturas if-else ou switch-case.

### if-else
#### if

Se você quer que o software execute um determinado comando somente em certas situações, utilize if para determinar isto. O programa vai, então, executar a primeira linha de código após o if, se a declaração entre parênteses for verdadeira. Exemplo:
Pode-se usar valores booleanos:
Ou, se booleano tiver que ser falso para ocorrer a execução:
Mas se você quiser que o computador execute várias linhas após o if se este for verdadeiro? Basta usar chaves:

#### else

É também possível usar o bloco else para o computador executar várias linhas de código caso uma condição tenha o valor booleano falso. Por exemplo:
Assumindo que a variável temperatura tem tipo inteiro (int), se esta contiver um valor, por exemplo, 20, será apresentada na tela a mensagem "Está calor", uma vez que 20 < 20 é uma expressão é contradição, logo tem o valor booleano falso.
Podemos ainda encadear vários else, e obter ainda mais possibilidades:
Desta forma, conseguimos distinguir o nível de depósito de gasóleo de um carro em 3 níveis diferentes. Para distinguir por mais níveis, bastaria acrescentar mais } else if(...condição...) { para distinguir os diferentes patamares.
De notar que, cada caso é avaliado individualmente, por ordem. Isto é, primeiro seria verificado se o depósito tem menos de 20% de gasóleo; apenas se esta condição for falsa é que o computador avalia a segunda condição, para verificar se o depósito tem menos de 50% de gasóleo, e por ainda adiante.

### switch

O switch é muito parecido com o if-else. Apenas a sintaxe e construção é diferente
* Cada um dos casos tem de ser uma constante (não pode alterar durante a vida do programa), neste exemplo A, B, …
* O defaut serve para a condição de todas as avaliações dos casos anteriores der falsa. (é tipo o else)
* O break serve para terminar o switch, caso contrário se num dado case fosse verdadeiro, iria executar todos os statementes mesmo de outros cases até terminar o switch.
* Aqui para cada caso não necessitamos de se tivermos mais do que 2 statements.
* o if-else é mais forte do que o switch por que permite fazer coisas como:
* Para além do ponto já dito de os casos serem obrigatoriamente constantes, no switch
* Também posso utilizar operadores lógicos no switch

### Operador condicional "?"

A sintaxe é :
* [Relational expression] ? [statement if true] : [statement if false]
Ou seja, este operador testa a expressão relacional e se o resultado for verdadeiro executa logo a 1ª afirmação caso contrário executa a segunda.
ou seja isto não é mais do que um if-else.
Há quem goste de usar este operador porque poupa escrita, mas acho que não vale a pena!
Notar que o operador condicional exige 3 operandos.
vamos fazer uns exercícios:
* 7==5 ? 4 : 3 // returns 3, since 7 is not equal to 5.
* 7==5+2 ? 4 : 3 // returns 4, since 7 is equal to 5+2.
* 5>3 ? a : b // returns the value of a, since 5 is greater than 3.
* a>b ? a : b // returns whichever is greater, a or b.

## O Comando goto

O goto realiza um salto para um local especificado. Este local é determinado por um rótulo. Portanto pode ser em qualquer parte do programa.
Repare no rótulo.
Nota: Evite o uso de goto quando for possível usar estruturas principais, porque pode tornar o código ilegível. Esse comando deve ser usado em último caso, como sair de loops aninhados.

## Terminando o programa

Esta função é definida com a biblioteca cstdlib (c+std+lib) O propósito da função é terminar com o programa com um específico código de saída O protótipo é:
* int exit (int exitcode);
Esta função é usada por alguns sistemas operativos e podem ser usadas para chamar programas. Por convenção o código 0 se saída significa que o programa terminou normalmente, como previsto, se vier com outro número significa que houve um erro e algo de inesperado sucedeu.