O jovem padawan precisava incrementar um contador inteiro (counter) com um valor inteiro (delta) variável. Entretanto, o contador não poderia ultrapassar um certo valor máximo (countermax).
Por se tratar de um problema simples, o aprendiz rapidamente escreveu o trecho de código abaixo:
if (counter + delta <= countermax) { counter += delta; return true; } |
O mestre, com toda sua experiência, falou: “Cuidado é preciso ter!”. Sugeriu ao padawan que escrevesse o código da seguinte forma:
if (countermax – counter >= delta) { counter += delta; return true; } |
Qual era o problema com a forma mais simples e intuitiva escrita pelo jovem aprendiz?
Na errada ele deixa de contar uma vez porque ele soma antes. Eduardo Mota
“Ele soma antes de avaliar a condição”. Podemos comparar com i++ e ++i. Eduardo Mota
Sendo que são coisas diferentes, claro…
O problema é que na forma como o jovem aprendiz fez o contador, o mesmo podia passar do valor máximo (countermax) logo no primeiro teste já que o valor de (delta) é variável e não se sabe qual o valor dele.
Na sugestão do mestre ele verifica se o valor de (delta) não vai ultrapassar o valor restante em (countermax).
O problema com o método do Padawan é que a verificação pode resultar em erros dependendo do valor de delta. Como Yoda demonstrou, o segundo método não incorre em erros pois, como menciona o enunciado, o delta é a única variável cujo valor se altera, por isso é melhor usada como resultado de uma verificação do que como parte dela, simplificando assim o processamento do programa. May the 4th be with you.
Fazer o casting da var pra INT 😀
O problema é que caso o delta for negativo, o return da função sempre vai ser verdadeiro.
Na condição que o prendiz fez, dependendo do valor de delta, o valor do counter pode ser maior que o valor do countermax. Já na condição elaborada pelo mestre, independente do valor de delta, o valor do conter nunca será maior que o valor do countermax.