Skip to content

Latest commit

 

History

History
111 lines (101 loc) · 2.33 KB

desvios.org

File metadata and controls

111 lines (101 loc) · 2.33 KB

Desvios Incondicionais

1 Desvios Incondicionais

Tipos

  • Irrestritos
  • Restritos

2 Irrestritos

Evitá-los

\pause É o comando goto

  • Diminui a legibilidade
  • Em alguns casos, pode ter ganho de desempenho

3 Restritos

Permitem finalização diferente da usual

Desvios disciplinados e estruturados

Não entram em repetições nem desviam o fluxo para um lugar qualquer

\pause Comandos típicos

  • break; – termina um bloco de laço mais interno
  • continue; – pula o resto da iteração do laço mais interno
  • return; – sai do subprograma
  • exit; – sai do programa

4 Restritos

Exemplo com break;

S=0;
for(;;){ // lê um número inteiro natural
  printf("n: ");
  scanf("%d", &n);
  if(n <= 0) break; // vai para o fim do laço e sai
  s+=n;
}

5 Restritos

Exemplo com continue;

S=0; i = 0;
while(i<10){ // soma 10 números naturais
   printf("n: ");
   scanf("%d", &n);
   if(n < 0) continue; // volta para o início do laço
   s+=n;
   i++;
}

6 Restritos

Exemplo com return e com exit

void trata (int erro) {
  if(erro==0){
     printf("nada a tratar");
     return; // interrompe função
  }
  if(erro<0){
     printf("erro grave");
     exit(1); // sai do programa
  }
  printf("erro tratado");
}

7 Restritos

Escapes rotulados (Java/Ada) Exemplo

busca:
for(i=0; i<arrayOfInts.length; i++) {
    for(j=0; j<arrayOfInts[i].length; j++) {
       if (arrayOfInts[i][j] == searchfor) {
          encontrado = true;
          break busca;
       }
    }
}

8 Restritos

Escapes rotulados (Java/Ada) Exemplo genérico

Loop_externo:
for(;;) {
    Loop_interno:
    for(;;){
        /* comandos */
        break Loop_interno;
        /* comandos */
        continue Loop_externo;
    }
}