paulo1205
(usa Ubuntu)
Enviado em 27/09/2023 - 22:43h
Se o código for compilado com opções de diagnósticos (para o GCC, eu recomendo sempre “
-Wall -Wextra -Werror -pedantic-errors -O2”; para outros compiladores podem ser outras opções), o compilador vai apresentar erro para a falta do comando
return.
Se você compilar sem essas opções, e mais ainda se ele estiver configurado para usar um padrão antigo da linguagem C, ele pode tolerar várias construções obsoletas, incluindo, em alguns casos, a omissão de um
return. Nesses casos, em algumas arquiteturas (incluindo os nossos PCs), o valor presente em um dos registradores (nos nossos PCs é o acumulador, que corresponde ao registrador
EAX numa arquitetura em que o tipo
int tem largura de 32 bits) é assumido como o valor retornado pela função, porque, na prática, o que o comando
return faz quando o tipo de retorno é
int ou
unsigned int é justamente copiar o valor informado para o acumulador, antes de devolver o fluxo de execução para o ponto que chamou a função.
Assim sendo, o mais provável para a sua função ter “funcionado”, mesmo com um erro crasso como o que você mostrou, é que calhou de o compilador ter gerado código que usava o acumulador para guardar o valor calculado, e esse valor simplesmente não foi substituído por outra coisa quando a função chegou ao final, e o chamador da função simplesmente usou o valor do acumulador, apesar de não ter havido um comando que explicitamente o preenchesse.
... Então Jesus afirmou de novo: “(...) eu vim para que tenham vida, e a tenham plenamente.” (João 10:7-10)