
		paulo1205
		
		(usa Ubuntu)
		
		Enviado em 19/10/2016 - 16:08h 
		Eu sempre fico impressionado como alguém, ao escrever um programa simples mas que não funciona, quer logo colocar a culpa no compilador, em vez de olhar para o próprio programa primeiro.
Além de ter utilidade limitada, duplicando de forma piorada aquilo que se pode fazer com o comando 
seq, o programa indicado na primeira postagem possui diversos exemplos de erros e de práticas de programação ruins.
Exemplos de erros:
- Declaração inadequada da função 
main -- deveria ser “
int main(void)”, já que o programa não recebe argumentos pela linha de comando (se os recebesse, deveria ser “
int main(int argc, char **argv)” ou equivalente).
- Conversões de 
scanf() incompatíveis com os tipos de dados das variáveis que devem receber os valores lidos.
- Mesmo erro nas chamadas a 
printf() e 
fprinf() que imprimem o valor de 
n1.
- Se as conversões de 
scanf() estivessem correta, ainda haveria a chance de o laço de repetição nunca acabar.  Se o valor finalmente atribuído a 
n2 for igual ao maior valor possível para um dado do tipo 
long int, então por definição a comparação “
n1<=n2” será sempre verdadeira.
Exemplos de hábitos ruins:
- Não se testam os valores de retorno das chamadas a 
scanf(), de modo que 
n1 e 
n2 podem chegar com valores desconhecidos ao laço de repetição (e.g. se o usuário digitar uma letra em vez de um valor numérico).
- Se acontecer o problema mencionado acima, o restante da execução do programa fica imprevisível.  Com sorte, o loop pode terminar sem executar nenhuma iteração (se 
n1>
n2); com azar, pode nunca acabar (
n2==
LONG_MAX).  Depender de sorte, em qualquer programa, é o fim da picada.
- Também não se testam os resultados das operações de escrita.  De fato, é bem menos comum fazer isso mas, a rigor, também as operações de escrita deveriam ser verificadas quanto a possíveis erros, especialmente num programa que gera um arquivo como saída.  Só não devem verificar se as operações de escrita foram bem sucedidas programas que não se importem de perder dados ou de entregar ao usuário algo diferente daquilo que ele pediu..
- A atribuição “
n1=n1” não chega a ser um erro, mas é inútil.  Sendo inútil, deveria ser removida.  A sintaxe do comando 
for permite essa remoção.
- Contudo, se você quiser evitar o possível loop infinito, possivelmente não deve usar 
for, mas talvez uma combinação de 
if com 
do-
while.
- Chamar 
system() para uma operação trivial como limpar a tela é um tremendo desperdício.  Se limpar a tela fosse absolutamente necessário para o programa, a funcionalidade deveria residir no programa, ainda que através de uma biblioteca padronizada, tal como Curses ou algum clone da ConIO.
- Chamar 
system() também é um tremendo furo de segurança, ainda mais quando você não diz o caminho exato do comando a ser executado.  Se o usuário possui algum script chamado 
clear num diretório local que esteja presente no valor da variável de ambiente 
PATH, esse script pode acabar sendo chamado, em vez do utilitário do sistema que você esperava que fosse chamado.
- 34,48% da extensão do programa (10 de 29 linhas contendo texto) são usadas com créditos e outras firulas.  Acho que não precisa disso -- ainda mais no atual estado do programa.