Como o compilador está "enxergando" esse retorno? [RESOLVIDO]

1. Como o compilador está "enxergando" esse retorno? [RESOLVIDO]

Daniel
Del1rious

(usa Outra)

Enviado em 25/09/2023 - 09:00h

Gente eu fiz um função recursiva para fatorial, deu certo e eu entendi como ela funciona, mas tem algo que está estranho, segue o código:

int factorial(int seed) {
int total = 1;

if(seed > 0) {
total = seed * factorial(seed - 1);
} else {
return total;
}
}


Assim, se a seed for maior que zero, a condição será validada e ignorará o else certo? Porém, ao ignorar o else, a função fica sem retorno, e na minha cabeça isso era para dar um erro de função sem retorno, mas quando eu executo o código ele me retorna o fatorial certo, ou seja, o compilador meio que está "vendo" que a função está sem retorno e busca nos escopos dela algum retorno? E acha o return total e executa?


  


2. Re: Como o compilador está "enxergando" esse retorno? [RESOLVIDO]

aguamole
aguamole

(usa KUbuntu)

Enviado em 25/09/2023 - 10:36h

Cara o chatGPT diz que o seu código esta errado, ele diz que o seu código não esta realizando o fatorial e apenas retorna o total sem realizar o fatorial, foi isso que entende. Tem um bug no código ai. Ele sempre vai reportar o total no return sem realizar o fatorial.


3. Re: Como o compilador está "enxergando" esse retorno? [RESOLVIDO]

Daniel
Del1rious

(usa Outra)

Enviado em 25/09/2023 - 11:03h


aguamole escreveu:

Cara o chatGPT diz que o seu código esta errado, ele diz que o seu código não esta realizando o fatorial e apenas retorna o total sem realizar o fatorial, foi isso que entende. Tem um bug no código ai. Ele sempre vai reportar o total no return sem realizar o fatorial.

Exatamente, era para o código dar erro, mas não está dando, o código retorna o fatorial correto dos números dentro da faixa do int. Se a seed for maior que zero ele valida o if e invalida o else, na teoria a função fica sem retorno, por que o único retorno que tem está dentro do else, porém, ao invés do compilador retornar um erro desse contexto ele simplesmente aceita e compila o código, que ao ser executado retorna o fatorial correto.




4. Re: Como o compilador está "enxergando" esse retorno? [RESOLVIDO]

aguamole
aguamole

(usa KUbuntu)

Enviado em 25/09/2023 - 11:15h

Cara se não esta dando o problema que diz o chatGPT então é pq o compilador esta fazendo tratamento de erro, esses compiladores eles codificam o assembly melhor que a maioria dos humanos, você pode compilar sem usar o parâmetro do compilador com otimização, usando no lugar de -O2 você pode aplicar o -O0, talvez isso remova o tratamento do erro do seu código.


5. Re: Como o compilador está "enxergando" esse retorno? [RESOLVIDO]

Paulo
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)






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts