Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

Dúvida no Ex. 2 da Aula 5 - Código sem as chaves

Olá,

Como que este código compila sem nenhuma chave nos fors?

class A {
    public static void main(String[] args) {
         fora: for(int a=0;a<30;a++)
         for(int b=0;b<1;b++)
         if(a+b==25) continue fora;
         else if(a+b==20) break;
         else System.out.println(a);
    }
}

Sempre tive o entendimento que, para funcionar sem as chaves eu deveria ter apenas uma única linha, como por exemplo no último else.

2 respostas
solução!

Olá Ingrid, tudo bem?

Você está certa! Instruções como for e if permitem que as chaves sejam omitidas, e caso façamos isso, o bloco da instrução será apenas a próxima linha de código do programa.

Então, como você já deve saber, no caso do seguinte código, dentro de um método main:

if(1 != 2)
    System.out.println("2 é diferente de 1!");
System.out.println("Essa linha será sempre executada, não importa o resultado do if!")

O primeiro System.out.println nesse caso não será executado. E o segundo System.out.println sempre será executado. Apenas o primeiro System.out está dentro do bloco do if. O segundo não pertence ao bloco.

No caso do código que você postou, temos um for sem chaves, que dentro do seu bloco (que nesse caso é a próxima linha), possui um outro for. Esse segundo for, aninhado, também tem como seu bloco a próxima linha, um if e por aí vai.

É isso que ocorre: se na próxima linha de um for sem chaves você usa uma instrução de bloco (for, if, else if, else while...), ele terá seu próprio bloco na próxima linha...

Você pode identar o código para ficar mais claro:

class A {
    public static void main(String[] args) {
         fora: for(int a=0;a<30;a++)
             for(int b=0;b<1;b++)
                 if(a+b==25) continue fora;
                 else if(a+b==20) break;
                 else System.out.println(a);
    }
}

O código funciona e corresponde ao seguinte código:

class A {
  public static void main(String[] args) {
    fora: for(int a=0;a<30;a++) {
      for(int b=0;b<1;b++){
        if(a+b==25) {
          continue fora;
        }
        else if(a+b==20) {
          break;
        }
        else {
          System.out.println(a);
        }
      }
    }
  }
}

Faz sentido?

Abraço.

Faz sentido sim. Eu estava com a impressão errada de que o próximo bloco deveria ser limitado a uma única linha e não poderia ser um novo bloco.

Muito obrigada pela explicação!