Subsecções

5 Aninhando senteças if e if-else

Como era de se esperar, é possível colocar uma sentença condicional dentro de outra. Por exemplo, se quisermos imprimir uma mensagem apropriada caso um número seja positivo ou negativo e par ou ímpar, nós poderíamos escrever o seguinte:

#include <stdio.h>

main(void)
{
  int num;
  
  /* Obtem um numero do usuario */
  printf("Entre com um inteiro: ");
  scanf("%d", &num);
  
  /* Imprime uma mensagem dizendo se o numero e positivo ou
     negativo, positivo ou negativo. */
  if (num >= 0) {
    if (num % 2 == 0)
      printf("O numero e par e positivo\n");
    else
      printf("O numero e impar e positivo\n");      
  }
  else {
    if (num % 2 == 0)
      printf("O numero e par e negativo\n");
    else
      printf("O numero e impar e negativo\n");      
  }
}

5.1 A ambigüidade do else

O aninhamento de sentenças if-else sem usar chaves ({ e }) para delimitar o bloco de senteças a ser executado pode trazer efeitos indesejados.

Há uma regra simples para determinar qual if está associado a qual else.

Regra de associação:

Um else está associado com a última ocorrência do if sem else.

O exemplo seguinte está errado porque associa o else ao if "incorreto":

#include <stdio.h>

main(void)
{
  int num;
  
  /* Obtem um numero do usuario */
  printf("Entre com o numero de peras: ");
  scanf("%d", &num);
  
  /* Imprime uma mensagem dizendo se o numero de peras e 0 ou 1
     (*** isto esta' errado !!  ***) */
  if (num != 0)
    if (num == 1)
      printf("Voce tem uma pera.\n");
  else
    printf("Voce nao tem nenhuma pera.\n");
}

Neste exemplo, o if tem o seguinte significado, segundo a regra de associação:

#include <stdio.h>

main(void)
{
  int num;
  
  /* Obtem um numero do usuario */
  printf("Entre com o numero de peras: ");
  scanf("%d", &num);
  
  /* Como a sentenca if e' vista pelo compilador */
  if (num != 0)
    if (num == 1)
      printf("Voce tem uma pera.\n");
    else
      printf("Voce nao tem nenhuma pera.\n");
}

Para evitar este problema, chaves ({ e }) devem ser usadas para tirar a ambiguidade. O exemplo abaixo mostra como as chaves podem ser inseridas para corrigir o programa acima.

#include <stdio.h>

main(void)
{
  int num;
  
  /* Obtem um numero do usuario */
  printf("Entre com o numero de peras: ");
  scanf("%d", &num);
  
  /* Como corrigir o problema (este programa funciona) */
  if (num != 0) {
    if (num == 1)
      printf("Voce tem uma pera.\n");
  }  else
    printf("Voce nao tem nenhuma pera.\n");
}

Exercício 1:

Faça um programa que leia 3 números e imprima o maior.

/usr/local/lib/tex/inputs///Programas/Exercicio_04-1.c

Armando Luiz Nicolini Delgado
2013-10-21