17

フォーラムの周りで悪名高いものをよく見かけますがvoid main()、質問の直後に、ユーザーに絶対に使用しないようにというコメントが表示されますvoid main()(これには完全に同意します)。しかし、の起源はvoid main()どこですか?

適切mainな方法はint. この質問や他の多くの人で説明されているように、この方法が間違っている理由は理解していますが、この宣言方法がどのように生まれたのmainか、あるいは一部の学生にまだ教えられている理由さえわかりません。

4

7 に答える 7

10

Bjarne Stroustrup でさえvoid main、C++ で を書いているので、これは確かに一般的な反ミームであり、古いものであり、Java やvoid main. もちろん、Bjarne はvoid main、C や C++ の一部ではないものも書いています。ただし、この後者のステートメント (彼の FAQ 内) については、少なくとも C99 の時点では、Bjarne が間違っているように見えます。なぜなら、C99 標準の N869 ドラフトでは、§5.1.2.2.3/1 で次のように述べられているからです。

「関数の戻り値の型が とmain互換性のある型である場合、関数intへの最初の呼び出しからの戻りは、関数によって返された値を引数として関数mainを呼び出すことと同じです。関数を終了するに到達すると、値 0 が返されます。戻り値の型が と互換性がない場合、ホスト環境に返される終了ステータスは規定されていません。exitmain}mainint

以前、その §5.1.2.2.1/1 で、 の署名について述べていますmain

「または他の実装定義の方法で。」

intたとえば、「と互換性がない」戻り値の型はvoid.

したがって、これは完全な答えではありませんが (これに関する歴史的な情報源がネット上で入手できるとは思えません)、少なくとも質問の仮定を修正する方向に進んでいます。void mainC および C++ で完全に忌まわしいというわけではありません。しかし、C++ では無効です。これは、ホストされた C++ 実装ではサポートされていない C のものです。

于 2012-12-19T07:09:51.703 に答える
4

私はこの問題の被害者だったので、なぜこれが起こったのかを説明できると思います.Cの講義中に、教員はサンプルプログラム(おそらく「Hello World」)を使用して講義を開始する必要があり、そのためにmainを使用する必要があります. ()メソッド。

しかし、彼らは学生を混乱させたくないので、C プログラミングのレッスンの最初に戻り値の型と戻り値のステートメントを教えることの複雑さに入りたくないので、使用します (また、使用するように私たちに求めます)。void main()を定義し、関数と戻り値の型を詳細に学習するまで、これをデフォルトの型と見なすように指示します。

したがって、これは、C プログラミングの最初の講義から void main() を使用するという間違った習慣を身に付けることにつながります。

ほとんどのコンピュータープログラマー、特に新しいプログラマーがこの悪い習慣を身につける理由について、これで十分に説明できることを願っています。

乾杯、マヤンク

于 2012-12-19T07:17:23.977 に答える
2

個人的には次のように思います: K&R C は戻り値の型を指定する必要がなく、暗黙のうちに intである仮定し、同時に K&R の例では戻り値を使用しませんでした。

たとえば、K&R 初版の最初のコードは次のとおりです。

#include <stdio.h>

main() 

{
   printf("Hello World\n");
}

したがって、後でこれを読んだ人々が (一部のコンパイラによって void 型が拡張機能として言語に追加された後)、 main に実際には void return ステートメントがあると想定したのも不思議ではありません。

実際、K&R は後で次のように述べています。

簡単にするために、ここまでメイン関数から return ステートメントを省略しましたが、プログラムが環境にステータスを返さなければならないことを思い出させるために、後で含めます。

これは、人々が愚かなことをする前にすべてを読むだろうという仮定の下で、間違ったコードを書き、後で免責事項を含めるとどうなるかの別の例です;)

于 2012-12-19T07:10:54.053 に答える
2

ベア メタル、つまりオペレーティング システムのない状態で実行される組み込みプログラムは、元に戻ることはありません。電源投入時に、リセット ベクトルが間接的に (最初に発生するいくつかのメモリ初期化があります) にジャンプし、そのmain内部でmain無限while (1){}ループが発生します。意味的には、 の戻り値はmain意味がありません。

于 2015-07-10T15:04:20.147 に答える
1

考えられる理由:

  • Java プログラマーはpublic static void main(...).
  • return ステートメントが欠落しているとmain、暗黙的に を返しますが、返されないと仮定するものがある可能性があります0
  • Cmain()では、戻り値の型を指定せずに書くことができました。これはintデフォルトです。たぶん、欠落している戻り値の型が a と同等であると考える人もいvoidます。
  • 悪い本/教師?
于 2012-12-19T06:50:13.027 に答える