37

(私は Visual C++ 2008 を使用しています) main() は整数を返す必要があるといつも聞いていましたが、ここでは入れずreturn 0;、エラー 0 と警告 0 でコンパイルしました! デバッグ ウィンドウでは、プログラムがコード 0 で終了したと表示されます。この関数が main() 以外の名前である場合、コンパイラは、'blah' は値を返さなければならないと警告します。a を貼り付けてreturn;も、エラーが表示されます。しかし、それを完全に除外すると、問題なくコンパイルされます。

#include <iostream>
using namespace std;

int main()
{
    cout << "Hey look I'm supposed to return an int but I'm not gonna!\n";
}

これは VC++ のバグでしょうか?

4

4 に答える 4

73

3.6.1 主な機能

....

2 実装はmain関数を事前定義してはならない。この関数はオーバーロードされません。type の戻り値の型を持つ必要がありintますが、それ以外の場合、その型は実装定義です。すべての実装は、main の次の定義の両方を許可する必要があります。

int main() { /* ... */ }

int main(int argc, char* argv[]) {
/* ... */
}

....そして追加し続けます...

5returnステートメント in にmainは、メイン関数を終了し (自動保存期間を持つオブジェクトをすべて破棄する) exit、戻り値を引数として呼び出すという効果があります。制御が return ステートメントに遭遇せずに の最後に達した場合main、結果は return 0 を実行したことになります

C++ 標準のオンライン コピーを見つけようとして、この一節を引用できるようにしました。

于 2008-08-22T12:54:54.313 に答える
18

これは、C++ 言語標準の一部です。main に明示的な return ステートメントがない場合は、暗黙的な return 0 が生成されます。

于 2008-08-22T12:52:03.417 に答える
3

メイン関数にリターン0を含めない場合、VC++はリターン0を挿入するだけだと確信しています。同じことが関数でも発生する可能性がありますが、その場合は少なくとも警告が表示されます。

于 2008-08-22T12:51:49.033 に答える
2

セクション 6.6.3/2 には、「関数の最後からフローすることは、値を返さないことと同じです。これにより、値を返す関数で未定義の動作が発生します。」.

例は、VS 2010/g++ でせいぜい警告を出す以下のコードです。

int f(){
   if(0){
      if(1)
         return true;
   }
}

int main(){
   f();
}

したがって、要点は、以前の回答が指摘したように、「メイン」が特別であるということです。

于 2010-08-16T11:20:18.960 に答える