Why is return 0 optional?

后端 未结 4 1406
遥遥无期
遥遥无期 2020-11-27 21:48

Why, if I write

int main() 
{ 
    //... 
}

do I not need to write return 0; at the end of the main function? Do

相关标签:
4条回答
  • 2020-11-27 22:02

    C99 and C++ special case the main function to return 0 if control reaches the end without an explicit return. This only applies to the main function.

    The relevant bit of the C99 spec is 5.1.2.2.3 for the main special case

    5.1.2.2.3 Program termination

    If the return type of the main function is a type compatible with int, a return from the initial call to the main function is equivalent to calling the exit function with the value
    returned by the main function as its argument; reaching the } that terminates the main function returns a value of 0.

    6.9.1/12

    If the } that terminates a function is reached, and the value of the function call is used by the caller, the behavior is undefined.

    You can test this out with gcc:

    int foo ( void ) { }
    int main( void ) { }
    

    C89 mode ( errors for both functions ):

    sandiego:$ gcc src/no_return.c -std=c89 -Wall 
    src/no_return.c: In function ‘main’:
    src/no_return.c:2: warning: control reaches end of non-void function
    src/no_return.c: In function ‘foo’:
    src/no_return.c:1: warning: control reaches end of non-void function
    

    C99 mode ( main is a special case ) :

    sandiego:$ gcc src/no_return.c -std=c99 -Wall
    src/no_return.c: In function ‘foo’:
    src/no_return.c:1: warning: control reaches end of non-void function
    
    0 讨论(0)
  • 2020-11-27 22:12

    Yes. main in C is a very special function that has some extra rules. See the paragraph in the C99 standard about its termination below. In essence it says that if you quit the function without returning a value this is equivalent as if you had given a return value of 0. This is special to main, doing so with other functions where the calling function expects a return value might (and will) crash your program.

    If the return type of the main function is a type compatible with int, a return from the initial call to the main function is equivalent to calling the exit function with the value returned by the main function as its argument; reaching the } that terminates the main function returns a value of 0. If the return type is not compatible with int, the termination status returned to the host environment is unspecified.

    0 讨论(0)
  • 2020-11-27 22:12

    Basically, yes. Functions are not required to return anything, even if they declare a return type other than void. The value returned will be undefined.

    Note that C99 requires that functions that declare non-void return types always terminate by hitting a return statement. So if you were compiling using your compiler's C99 mode this code would result in a compile-time error.

    0 讨论(0)
  • 2020-11-27 22:28

    The most recent C (currently that's C99 with a few amendments) returns 0 from main by default if there is no explicit return statement at the end of the function, and control flows off the function's end (see 5.1.2.2.3 in C99 TC3). This is because most often one would write such a form of return anyway.

    In C89 you need to return something there - it has no such implicit return. But the compiler is by no means required to diagnose such a mistake (see 3.6.6.4 in the C89 draft and 6.9.1/12 in C99 TC3).

    0 讨论(0)
提交回复
热议问题