Well, I can still only say the behavior is undefined.
Visual Studio 2008 always xor's eax with eax, hence returning 0, whether you return void or you leave a return and make int main.
It does allow for functions returning a value not containing a return statement, though. One of your examples with no return returned 5 due to printf.