2010-09-25 18 views
5

Yo sé que ha sido la convención en C89 para volver siempre es un valor entero de 0 principal en un programa de C, así:¿Es necesario volver a cero desde principal, y cómo puede ser útil el valor de retorno de main?

int main() { 

    /* do something useful here */ 

    return 0; 
} 

Esta es devolver un "éxito" número al sistema operativo. Todavía me considero un principiante (o un programador intermedio en el mejor de los casos) en C, pero hasta la fecha nunca he entendido por qué esto es importante.

Supongo que este es un resultado útil si vincula el resultado de este programa a la entrada de otro, pero no estoy seguro. Nunca lo he encontrado útil, o tal vez simplemente no entiendo cuál es la intención.

Mis preguntas:

  1. vuelve a cero siempre es necesario partir de un programa en C?
  2. ¿Cómo es útil el valor de retorno de main()?
+0

http://stackoverflow.com/questions/204476/what-should-main-return-in -c-and-c –

Respuesta

5

Al escribir secuencias de comandos (como en Bash, o CMD.exe en Windows) se pueden encadenar algunos comandos con el & & y || operadores.

canónicamente, a && b se ejecutará b si el resultado de a es cero, y a || b se ejecutará si ba devuelto distinto de cero.

Esto es útil si desea ejecutar un comando condicionalmente si el anterior tuvo éxito. Por ejemplo, le gustaría eliminar un archivo si contiene la palabra foo. Entonces que va a utilizar:

grep foo myfile && rm myfile 

grep devuelve 0 cuando había un partido, de lo distinto de cero.

+0

¿Cómo es útil? –

+0

Creo que su respuesta es útil, pero no está muy clara. ¿Puedes darme un ejemplo? Parece que cortar y pegar un texto a partir de una búsqueda de las gafas ... – dvanaria

+0

No, no se cortó y el pasado, pero no soy un hablante nativo de Inglés, por lo que puede desconcertar a algunos lectores a veces. – Benoit

1

El valor de retorno es el "resultado" de la ejecución del programa, y ​​0 se utiliza para indicar una finalización exitosa, mientras que un valor de retorno distinto de cero indica una falla o terminación inesperada.

El valor de retorno realmente no le importa al sistema cuando lo llama a programar normalmente, pero puede tener dos propósitos. Uno de ellos es la depuración. En MSVC, el compilador utilizado más comúnmente para C++, ve los programas devuelven valor una vez que termina de ejecutarse. Esto puede ser útil para ver "cómo y por qué" salió su programa.

Otro uso es cuando se llama a su aplicación desde otros programas, donde el valor de retorno puede indicar éxito o transmitir un resultado.

0

Hola, como dijiste es principalmente si el programa se usa como parte de una red de programas más amplia. Si regresas a cero al entorno del programa, la red sabe que todo salió bien (como dijiste), pero también puedes hacer que vuelva 1, 2, 3 ... (dependiendo de qué error haya ocurrido) para que tu red de código sepa que algo ha salido mal. De forma equivalente, puede tener la salida (0) o la salida (1) al final de su programa "principal" para hacer exactamente lo mismo. Puede encontrar esto útil: http://en.wikipedia.org/wiki/Exit_status Espero que ayude.Jack

1

En C moderna también conocido como C99 (no estoy seguro de C89) todos los tres terminaciones de main son equivalentes:

  • que está por finalizar main en el último }
  • return 0
  • exit(0)

la idea detrás de todo esto es (como otros mencionaron) para dar un estado de retorno a la invocación de p rogram

+0

El primero es incorrecto. Salvo un 'retorno' explícito, una función C devolverá lo último que evaluó. 'int main() {printf (" ¡Hola, mundo! \ n "); } 'saldrá realmente con' 14' porque 'printf()' lo devolvió. (Si tiene activadas las advertencias del compilador como debería, la compilación gritará sobre el control que llega al final de una función no nula.) La segunda es correcta solo en 'main()'. – Blrfl

+5

La primera de ellas es * * correcto en C99 (pero no en C89): "Si el tipo de retorno de la función principal es un tipo compatible con int, [...] llegar a la} que termina la función principal devuelve un valor de 0. " (C99 5.1.2.2.3) – schot

0

que puedes usar EXIT_SUCCESS cuando el programa terminó correctamente y EXIT_FAILURE cuando no lo hizo. EXIT_SUCCESS es cero, y cero es portátil para cualquier sistema operativo, mientras que EXIT_FAILURE cambia de UNIX a Windows, por ejemplo. Estas constantes se definen en el encabezado stdlib.h.

#include <stdlib.h> 

int main() 
{ 

    int toret = EXIT_SUCCESS; 

    if (!(/* do something useful here */)) { 
     toret = EXIT_FAILURE; 
    } 

    return toret; 
} 

El código de retorno del programa era más útil cuando los programas se escribían para la consola. Hoy en día, es bastante raro, a menos que trabaje en un entorno muy profesional (e incluso esto ahora está cambiando, con las herramientas de flujo de trabajo disponibles).

Como @Benoit Dicho esto, el código de salida indica al sistema operativo cuando la operación se ha realizado correctamente o no. Si el código de salida significa falla, entonces puede interrumpir el flujo del programa por lotes, ya que no es probable que funcione.

Por ejemplo, un compilador puede tener un código de salida de cero si la compilación se ha realizado correctamente, y cualquier otro valor si la compilación no tuvo éxito. En Windows, esto se puede acceder a través de la variable de sistema operativo "nivel de error":

gcc helloworld.cpp -ohelloworld.exe 
goto answer%errorlevel% 
:answer0 
copy helloworld.exe c:\users\username\Desktop 
echo Program installed 
goto end 
:answer1 
echo There were errors. Check your source code. 
:end 
echo Now exiting... 

Este archivo por lotes ventanas "instala" HelloWorld.exe en el escritorio cuando la compilación se ha realizado correctamente. Dado que puede activar la ejecución de archivos por lotes con doble clic, esto puede permitirle evitar tocar la línea de comando para la compilación.

Por supuesto, tener en cuenta que es mejor manejado por ambientes integrados (si no existiera el código de salida, que no sería capaz de funcionar correctamente). También tenga en cuenta que hacen es el mejor en este campo:

https://en.wikipedia.org/wiki/Make_(software)

Hacer necesita también de códigos de salida para funcionar correctamente.

+0

El archivo de inclusión correcto para C es "stdlib.h" y no "cstdlib.h" –

+0

Gracias por señalar este error torpe. – Baltasarq

+0

Me parece bastante extraño su afirmación de que los códigos de salida son "bastante poco comunes". Ciertamente, hay muchas áreas en las que ya no se utilizan ampliamente, pero estas son las mismas áreas donde C ya no se usa ampliamente. En la mayoría de los casos, si usa C, es bastante probable que también se preocupe por los códigos de salida. – Porculus

2

Volviendo 0 es una convención. Cuando un programa devuelve 0, se puede suponer que funcionó bien, sin mirar realmente lo que hizo el programa (ejem: D).

Como convención ampliamente utilizado, esa suposición es en muchos lugares. Como señala Benoit, ese es el caso del shell (UNIX y Windows) y otras partes del sistema operativo.

Así responder a sus preguntas:

  1. Para un programa C debe devolver ya sea EXIT_SUCCESS o EXIT_FAILURE. Pero puede devolver EXIT_FAILURE incluso si su programa funcionó bien.
  2. Si no devuelve un 0 (EXIT_SUCCESS), Es muy posible que otros programas asumirán su programa fallidos.

Hay una pregunta relacionada con C++ y C grandes respuestas

What should main() return in C and C++?

0

Podemos devolver cualquier número entero de main(). Ahora, por defecto main() función devuelve 0 si no se menciona explícitamente main() función para devolver un valor específico.

retorno 0 en realidad se parece que el programa termina con éxito sin ningún error aunque no es una regla, pero esta es la forma en que funciona.

Y si devolvemos explícitamente un número distinto de cero, aunque el programa se ejecute correctamente pero internamente significa que el programa terminó con algunos errores o el programa terminó con un resultado inesperado. Esto puede ser útil si se llama otro programa sobre la base de nuestros programas actuales valor de retorno utilizando '& &' o '||' en nuestra linea de comando

También puede comprobar el valor de retorno de su programa aplicado previamente en Linux a través de este comando:

echo $? 
Cuestiones relacionadas