2010-05-23 13 views
13

Muchos están familiarizados con el programa hola mundo en C¿Por qué debería preceder a la función main() en C con un tipo de datos?

#include <stdio.h> 

main() 
{ 
    printf ("hello world"); 
    return 0; 

} 

¿Por qué algunos preceden a la función main() con int como en:

int main() 

Además, he visto la palabra vacío' 'entrado dentro de la() como en:

int main(void) 

parece que la tipificación extra para nada, pero tal vez es una buena práctica que paga dividendos en otras situaciones?

Además, ¿por qué preceder main() con un int si está devolviendo una cadena de caracteres? En todo caso, uno esperaría:

char main(void) 

También estoy de niebla sobre por qué volvemos 0 al final de la función.

+1

No. Por un lado, es C y no C++, y por otro, pregunta por qué se necesitan un tipo de datos y una declaración de retorno. – Zarel

Respuesta

11

El siguiente ha sido válido en C89

main() { 
    return 0; 
} 

Pero en C moderna (C99), esto no está permitido más porque hay que indicar explícitamente al tipo de variables y tipo de funciones volver, por lo que se convierte en

int main() { 
    return 0; 
} 

Además, es legal para omitir el return 0 en C moderno, por lo que es legal escribir

int main() { 

} 

Y el comportamiento es como si se devuelve 0.

La gente pone void entre los paréntesis, ya que asegura verificación de tipos adecuada para las llamadas de función. Un conjunto vacío de paréntesis en C significa que no hay información sobre la cantidad y el tipo de los parámetros fuera de la función, y quien llama debe conocerlos exactamente.

void f(); 
/* defined as void f(int a) { } later in a different unit */ 

int main() { 
    f("foo"); 
} 

La llamada a f provoca un comportamiento indefinido, ya que el compilador no puede comprobar el tipo del argumento en contra de lo f Espera en los otros módulos. Si se va a escribir con void o con int, el compilador sabe

void f(int); /* only int arguments accepted! */ 

int main(void) { 
    f("foo"); /* 'char*' isn't 'int'! */ 
} 

Así que para main es sólo un buen hábito de poner void allí, ya que es bueno para hacerlo en otro lugar. En C puede llamar recursivamente al main, en cuyo caso esas diferencias pueden ser importantes.

Lamentablemente, solo unos pocos compiladores son compatibles con la C moderna, por lo que en muchos compiladores de C es posible que aún recibas advertencias por el uso de funciones C modernas.

Además, puede ver programas para declarar main para devolver cosas diferentes a int. Tales programas pueden hacer eso si usan una implementación independiente C. Dichas implementaciones C no imponen ninguna restricción en main ya que ni siquiera conocen ni requieren dicha función en primer lugar. Pero para tener una interfaz común y portátil para el punto de entrada del programa, la especificación C requiere programas estrictamente conformes para declarar main con el tipo de retorno int, y requiere alojado en implementaciones C para aceptar dichos programas.

+0

Ayuda a conocer las diferentes implementaciones de C, como C99. Esto explica por qué veo códigos diferentes en libros antiguos. Compré la Programación de Kochan en C para ayudarme a aprender C. Gracias a todas las respuestas de desbordamiento de la pila, ya que todos me han juntado las piezas. – Milktrader

13

La función main devuelve un código de estado entero que le dice al sistema operativo si el programa salió exitosamente.
return 0 indica éxito; devolver cualquier otro valor indica falla.

Dado que se trata de un número entero y no de una cadena, devuelve int, no char o char*. (Llamar a printf no tiene nada que ver con regresar de la función)

Las versiones anteriores de C permiten un tipo de devolución por defecto de int.
Sin embargo, es mejor especificar explícitamente el tipo de devolución.

En C (a diferencia de C++), una función que no toma ningún parámetro se declara como int myFunc(void)

+1

Correcto excepto por el "código de carácter". – dan04

+0

@ dan04: quise decir _status_; No tengo idea de por qué escribí el personaje. – SLaks

+3

principal es _not_ especial omitiendo el tipo de devolución. Más bien C asumirá un tipo de retorno de int si no se especifica uno. –

5

Se llama un estado de salida. Cuando el programa finaliza, desea que el destinatario sepa cómo salió su programa. Si salió normalmente, devolverá 0, etc.

Here donde puede obtener más información sobre los estados de salida.

1

La mayoría de los sistemas operativos utilizan códigos de salida para las aplicaciones. Normalmente, 0 es el código de salida para el éxito (como en, la aplicación se completó con éxito). El valor de retorno de main es lo que se devuelve al SO, por lo que main generalmente devuelve un entero (y dado que 0 es exitoso, la mayoría de los programas de C tendrán un 'return 0;' al final).

2

El razonamiento detrás de esto era proporcionar algún tipo de mecanismo de informe de errores. Entonces, cada vez que un programa devuelve un valor cero, eso generalmente significa que cree que completó su tarea con éxito. Para valores distintos de cero, el programa falló por alguna razón. De vez en cuando, ese número podría corresponder a un cierto mensaje de error. Varias llamadas a la API del sistema en C devuelven códigos de retorno para indicar si el proceso fue exitoso. Dado que no existe el concepto de una excepción en C, es la mejor manera de saber si sus llamadas tuvieron éxito o no.

1

La declaración "int" antes de la función principal es tipo de retorno de la función. Es decir, la función devuelve un número entero.

Desde la función, puede devolver un dato. Es típico devolver "0" si la función se completó con éxito. Cualquier otro número, hasta 255 se devuelve si el programa no se ejecutó correctamente, para mostrar el error que ocurrió.

Es decir, devuelve 0, con un tipo de datos int, para mostrar que el programa se ejecutó correctamente.

1

Es tradicional usar int main(int argc, char * argv[]) porque el retorno entero puede indicar cómo se ejecutó el programa. Devolver un 0 indica que el programa se ejecutó con éxito, mientras que un -1 indicaría que tuvo un error de algún tipo. Por lo general, los códigos de salida serían muy específica y se utiliza como un método de depuración desde excepciones (en el sentido de C++) no existen en C.

+1

No es ** char \ * [] argv **, pero ** char \ * argv [] ** – mosg

3

¿Por qué algunos preceden a la función main() con int como en:

En C (C 89 de todos modos, esa es la que usted parece estar refiriéndose a), funciones devuelven int por defecto cuando no van precedidos de ningún tipo de datos. Precediéndolo con int es solo una cuestión de preferencia.

Además, he visto la palabra 'vacío' entrado en el interior de la() como en:

Ésta es también una cuestión de preferencia en su mayoría, sin embargo, estos dos son bastante diferentes:

f(void) significa que la función f acepta zero argumentos, mientras f() significa que la función f acepta an unspecified number of arguments.

f(void) es la forma correcta de declarar una función que no tiene argumentos en C.

Parece que la tipificación extra para nada, pero tal vez es una buena práctica que paga dividendos en otras situaciones?

El beneficio es la claridad. Si vas a argumentar que menos tipeo es bueno, ¿qué piensas sobre nombrar todas tus funciones y variables y archivos y todo con el menor número de caracteres posible?

Además, ¿por qué precede main() con un int si está devolviendo una cadena de caracteres? En todo caso, uno esperaría:

carbón main (void)

¿Qué? ¿Por qué en el mundo devolvería una cadena de caracteres del main? No hay absolutamente ninguna razón para hacer esto ...

Además, su declaración de main devuelve un carácter, no una cadena de caracteres.

También estoy nublado acerca de por qué devolvemos 0 al final de la función.

Un programa devuelve un valor al sistema operativo cuando termina. Ese valor se puede usar para informar al sistema operativo sobre ciertas cosas. Por ejemplo, su escáner de virus podría devolver 1 si se encontró un virus, 0 si no se encontró un virus y 2 si se produjo algún error. Normalmente, 0 significa que no hubo ningún error y todo salió bien.

+0

gracias por explicar f() versus f (vacío) – Milktrader

Cuestiones relacionadas