I realize your question says, "C compiler", but just for information purposes, a C++ compiler has different requirements. In a standards-compliant C++ compiler, failing to declare the return type of main will generate an error. That return type should properly be "int". Leaving off the return statement will not generate an error in a compliant C++ compiler; the compiler is required to provide it behind the scenes.
All this has nothing to do with the semicolon question, of course. It's amazing how much logic one can put in an expression for an "if" or "while" construct.