Dúvida Simples sobre: return 0; [RESOLVIDO]

1. Dúvida Simples sobre: return 0; [RESOLVIDO]

Mr.Perfection
perfection

(usa Slackware)

Enviado em 19/03/2020 - 00:49h

Entendi BASTANTE porque declarar: int main(void) Nos Links abaixo
https://www.vivaolinux.com.br/topico/C-C++/Usar-ioh-no-Linux
https://www.vivaolinux.com.br/topico/C-C++/Duvida-sobre-a-funcao-main-Iniciante/

Minha dúvida está em declarar ou não return 0;
Entendi que o main é uma função que dá um return e que 0 seria executado com sucesso? (Corrijam-me se eu estiver errado)

Ai compilar da forma abaixo o compilador reclama da falta de return 0;
gcc Test2.c -o Test2 -Wall -O2 -pedantic -ansi -Werror -pedantic-errors
error: control reaches end of non-void function [-Werror=return-type]

Compreendo que consigo usar sem declarar return porém quero saber se é certo ou não.



  


2. MELHOR RESPOSTA

Paulo
paulo1205

(usa Ubuntu)

Enviado em 20/03/2020 - 10:03h

perfection escreveu:

Minha dúvida está em declarar ou não return 0;
Entendi que o main é uma função que dá um return e que 0 seria executado com sucesso? (Corrijam-me se eu estiver errado)

Ai compilar da forma abaixo o compilador reclama da falta de return 0;
gcc Test2.c -o Test2 -Wall -O2 -pedantic -ansi -Werror -pedantic-errors
error: control reaches end of non-void function [-Werror=return-type]

Compreendo que consigo usar sem declarar return porém quero saber se é certo ou não.


Quando você colocou a opçao “-ansi”, você explicitamente solicitou ao GCC que use as regras definidas pelo padrão do C que foi promulgado pela ANSI (Instituto de Padrões Nacionais Americanos) em 1989, também conhecido como C89. Essa versão do C exigia que todas as funções declaradas com tipo de retorno diferente de void deveriam explicitamente retornar um valor desse tipo (ou conversível para tal tipo).

Versões posteriores do padrão do C, tal como o de 1999 (C99) e o de 2011 (C11) (e, antes deles, também o C++ com o padrão de 1998 (C++98)), passaram a ter uma regra especial e diferenciada para a função main(), permitindo-lhe omitir o comando return ou a invocação de exit() explícitos, especificando que, nesse caso, o comportamento deveria ser equivalente à presença de um comando “return 0;” como último comando da função.

Você, então, pode, ao compilar seu programa, substituir a opção “-ansi” por outra, que lhe permita selecionar uma versão mais moderna do padrão (por exemplo: “-std=c99” para usar as regras do C99 ou “-std=gnu11” para usar as regras do C11 mais as extensões GNU), e isso será suficiente para não exigir a presença de um return ou exit() explícito antes do fim de main().

(Em tempo: note que eu falo de “comando return” e “invocação de exit()”, não de “declaração”. No contexto do C, uma declaração é o momento em que um novo símbolo, seja ele função ou variável, é apresentado ao programa, juntamente com a especificação do seu tipo de dados. Usar a terminologia de modo correto ajuda a comunicação.)


P.S. Não que minha opinião pessoal faça alguma diferença, mas, na minha cabeça de engenheiro, as exceções introduzidas nos padrões de 1999 do C e no do C++ de 1998 criaram, em nome da conveniência, uma anomalia. No padrão de 1989/1990, a ideia parecia ser a de realçar que main() é uma função como outra qualquer -- até porque ela de fato é uma função como qualquer outra em todos os outros aspectos, exceto pelo fato de ser a primeira função chamada pelo ambiente de execução. Ao criar uma regra excepcional para main(), acaba se complicando a construção do compilador e, de certa forma, criando uma brecha para dúvida, sobretudo na cabeça do aluno iniciante, que vê duas coisas com aspecto semelhante mas comportamentos diferentes.

... “Principium sapientiae timor Domini, et scientia sanctorum prudentia.” (Proverbia 9:10)

3. Re: Dúvida Simples sobre: return 0; [RESOLVIDO]

Adriano Siqueira
adrisiq

(usa KDE Neon)

Enviado em 19/03/2020 - 09:41h

A declaração é necessária, até porque a função main retorna um valor do tipo int.
O 0 representa a situação de sucesso, enquanto qualquer outro valor representa algum problema que aconteceu.


4. Re: Dúvida Simples sobre: return 0; [RESOLVIDO]

Mr.Perfection
perfection

(usa Slackware)

Enviado em 19/03/2020 - 11:39h

adrisiq escreveu: A declaração é necessária, até porque a função main retorna um valor do tipo int.
O 0 representa a situação de sucesso, enquanto qualquer outro valor representa algum problema que aconteceu.

Isso eu sei, eu quero saber porque? Entendo que se eu não preciso de nenhum retorno, para mim como programador ela não é necessária! Então posso não colocar ela! O que quero saber é PORQUE eu não precisando dela, deveria declara-la?




5. Re: Dúvida Simples sobre: return 0; [RESOLVIDO]

Rogerio
RogerDez

(usa Outra)

Enviado em 19/03/2020 - 14:25h

O que quero saber é PORQUE eu não precisando dela, deveria declara-la?

retorno 'nulo' não é a mesma coisa que retorno '0'


6. Re: Dúvida Simples sobre: return 0; [RESOLVIDO]

Mr.Perfection
perfection

(usa Slackware)

Enviado em 19/03/2020 - 15:05h

RogerDez escreveu: O que quero saber é PORQUE eu não precisando dela, deveria declara-la?
retorno 'nulo' não é a mesma coisa que retorno '0'

Entendi que se eu não retorno, estou dando um retorno nulo. Tudo bem!
Mas o que acontece? Onde afeta o Computador ou o Programa? O que estraga ou o que pode estragar neste caso? O que por exemplo, recursos de memória ou que o computador deixaria de fazer nesse caso?



7. Re: Dúvida Simples sobre: return 0;

berghetti
berghetti

(usa Debian)

Enviado em 19/03/2020 - 16:05h

Quando um programa encerra sua execução é uma boa pratica informar ao sistema operacional se deu tudo certo (retornar 0) ou o programa finalizou porque deu algum erro em sua execução (qualquer outro valor inteiro diferente de 0).

com o sistema operacional sabendo dessa informação, é possível tomar alguma decisão quando seu programa termina.

ex:
quando tenta rodar um programa no terminal e da erro, provavelmente o programa encerrou e retornou um código para o sistema operacional diferente de 0 (deveria pelo menos).

o script abaixo conhecendo o valor de retorno de saida do programa cat, informa se o arquivo existe ou não

#!/bin/sh

cat arq.txt > /dev/null 2>&1
cod_saida=$?
if [ $cod_saida -eq 0 ];
then
echo "arquivo encontrado"
else
echo "arquivo NAO encontrado"
fi


outro modo de sair de um programa é utilizar a função exit, que recebe um inteiro como argumento, nesse argumento podemos passar as constantes EXIT_SUCCESS ou EXIT_FAILURE definidas em sdblib.h com os valores 0 e 1 respectivamente, ou seja outro forma de dizer ao sistema operacional se você esta terminando seu programa com sucesso ou com falha.





8. Re: Dúvida Simples sobre: return 0;

Heitor Costa
Heitor.rj

(usa Slackware)

Enviado em 19/03/2020 - 19:29h


Serás castigado profano! Por não devolver o zero mais sagrado ao local de onde deve estar!

Brincadeiras a parte...


Nos compiladores C++ e C99 em diante, se vc não declarar, O compilador vai declarar para vc!.
Ele não está nem ai pro que vc acha!

Logo é bem possível dependendo da forma como você compile os seus programas que return 0; Estará lá!

Na versão de 1990 do C, atingir o final da função principal sem retornar um resultado faz com que um status indefinido seja retornado ao ambiente.

Se vc escreve programas ou jogos básicos vc nunca usará o retorno da sua função principal. Mas se você estiver escrevendo algo que pode ser usado por scripts, o valor de retorno da função principal é importante.

Um fato curioso: A função printf() retorna um inteiro que nós nunca usamos para nada. Ele é descartado.






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts