Os detalhes fazem diferença!

Bruna Ferreira - Jun 2 '23 - - Dev Community

Estou em contato com uma turma de introdução a programação, nela a maioria das pessoas entraram sem conhecer como um algoritmo ou uma linguagem de programação funciona.

O lado bom de escrever um programa é que ele vai fazer exatamente o que pedimos, o lado ruim é que ele vai fazer exatamente o que pedimos.

Pessoas iniciantes muitas vezes podem confundir símbolos de operadores ao escrever um código, a ordem de escrita de cada bloco ou até mesmo entrar em loop por semântica incorreta.

Java

A turma está utilizando a linguagem Java no aprendizado de programação, eu notei que alguns detalhes em códigos estão passando sem apontar mensagens de erro ao executar, como se estivessem certos. Vou mostrar dois exemplos aqui.

Estrutura for

Alguns alunos ao me mostrar o código que estavam exercitando, disseram que o programa estava entrando em loop. Veja o que está acontecendo:

for(i=3; i<= 10; i=i++){
   // ...
}
Enter fullscreen mode Exit fullscreen mode

Quando estamos conhecendo como funcionam as estruturas, precisamos ter atenção e aprender o que cada um dos parâmetros faz. No caso do for, temos no primeiro a atribuição de um valor inicial (i=3), no segundo uma comparação como critério de parada (i<=10) e no terceiro um incremento do valor (i++).
O detalhe errado aqui foi justamente no incremento, por falta de atenção ou entendimento, foi escrita uma atribuição i=i onde o ++ foi ignorado.
Desta forma temos o incremento que não sai do mesmo valor de i=i (substituindo pelos valores 3=3), nunca chegando no critério de parada de um número maior que 10.
A correção pode ser feita assim:

for(i=3; i<= 10; i=i+1)
for(i=3; i<= 10; i++)
Enter fullscreen mode Exit fullscreen mode

Estrutura while

Alguns dos códigos que recebi estavam entrando em estruturas quando não eram para entrar e vice-versa. Observe o trecho a seguir:

public class Main {
    public static void main(String[] args) {
        boolean flower = false;
           // ...
        while (flower =! true){
            flower = true;
        }
    }
}
Enter fullscreen mode Exit fullscreen mode

O objetivo era entrar na estrutura de repetição while, porém não entrou. O motivo foi uma simples troca de ordem de símbolos que não acusou nenhum erro ao executar, percebeu?

Mas por que não acusou nenhum erro? Vejamos, sintaticamente a escrita do código não está incorreta, apesar de não ter o sentido que queríamos. O que está acontecendo na linha do while é uma atribuição da negação em vez de uma comparação de diferença.

(flower =! true) // atribuição
(flower != true) // comparação
Enter fullscreen mode Exit fullscreen mode

Ou seja, na primeira expressão flower recebe !true (que é false). Na segunda expressão é comparado se o valor de flower é diferente de true.

Considerações

Entender se torna mais produtivo do que decorar, busque por detalhes quando estiver aprendendo, faça testes em cima de valores conhecidos para ter certeza que está correto e lembre-se que nem sempre estar funcionando significa estar certo.

Enjoy!

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .