14

多くの人がCのhelloworldプログラムに精通しています。

#include <stdio.h>

main ()
{
    printf ("hello world");
    return 0;
}

main()関数の前に次のようなものがあるのはなぜですかint

int main()

また、次のように単語voidが内部に入力されているのを見()ました。

int main(void)

余分なタイピングは無料のように思えますが、他の状況で配当を支払うのがベストプラクティスかもしれません。

また、main()文字列を返す場合、なぜintを前に付けるのですか?どちらかといえば、次のことを期待します。

char main(void)

また、関数の最後に0を返す理由についても霧がかかっています。

4

8 に答える 8

14

このmain関数は、プログラムが正常に終了したかどうかをオペレーティングシステムに通知する整数のステータスコードを返します。
return 0成功を示します。その他の値を返す場合は、失敗を示します。

これは整数であり、文字列ではないため、、intnotcharまたは。を返しますchar*。(呼び出しprintfは、関数から戻ることとは何の関係もありません)

古いバージョンのCでは、デフォルトの戻りタイプはint。です。
ただし、リターンタイプを明示的に指定することをお勧めします。

Cでは(C ++とは異なり)、パラメーターを受け取らない関数は次のように宣言されます。int myFunc(void)

于 2010-05-23T17:57:57.143 に答える
12

以下はC89で有効です

main() {
  return 0;
}

しかし、最近のC(C99)では、変数の型と関数の型を明示的に指定する必要があるため、これは許可されなくなりました。

int main() {
  return 0;
}

return 0また、現代のCではを省略することは合法なので、書くことは合法です

int main() {

}

そして、その振る舞いは0を返したかのようです。

void関数呼び出しの適切な型チェックを保証するため、括弧の間に入れます。Cの括弧の空のセットは、パラメーターの量とタイプに関する情報が関数の外部に公開されていないことを意味し、呼び出し元はこれらを正確に知る必要があります。

void f();
 /* defined as  void f(int a) { } later in a different unit */

int main() {
  f("foo");
}

を呼び出すと、未定義の動作が発生します。これは、コンパイラが引数のタイプを他のモジュールで期待されるfものと照合できないためです。を使用して、またはを使用しfて作成する場合、コンパイラは次のことを認識します。voidint

void f(int); /* only int arguments accepted! */

int main(void) {
  f("foo"); /* 'char*' isn't 'int'! */
}

ですから、他の場所で行うのは良いことなので、そこmainに置くのは良い習慣です。voidCでは、再帰的に呼び出すことができますmain。その場合、そのような違いが問題になることもあります。

残念ながら、最新のCをサポートしているコンパイラはごくわずかであるため、多くのCコンパイラでは、最新のC機能を使用することについて警告が表示される場合があります。

mainまた、とは異なるものを返すことを宣言するプログラムが表示される場合がありますintそのようなプログラムは、独立したC実装を使用する場合にそれを行うことができます。mainそのようなCの実装は、そもそもそのような関数を知らないか、必要としないため、制限を課しません。ただし、プログラムのエントリポイントへの共通の移植可能なインターフェイスを使用するには、C仕様では、厳密に準拠したプログラムが戻り型intでmainを宣言する必要があり、ホストされたC実装がそのようなプログラムを受け入れる必要があります。

于 2010-05-23T18:05:54.257 に答える
5

これは終了ステータスと呼ばれます。プログラムが終了したら、プログラムがどのように終了したかを呼び出し先に知らせます。正常に終了した場合は0、などに戻ります。

ここで、終了ステータスについて詳しく知ることができます。

于 2010-05-23T17:57:57.740 に答える
3

次のように、main()関数の前にintを付けるものがあるのはなぜですか。

C(C 89とにかく、それはあなたが参照しているように見えるものです)では、関数のint前にデータ型がない場合、関数はデフォルトで戻ります。その前に置くintのは、最終的には好みの問題です。

また、次のように()内に「void」という単語が入力されているのを見ました。

これもほとんどの場合好みの問題ですが、これら2つはまったく異なります。

f(void)関数が引数をf受け入れることを意味し、関数がを受け入れることを意味します。zerof()fan unspecified number of arguments

f(void)Cで引数をとらない関数を宣言する正しい方法です。

余分なタイピングは無料のように思えますが、他の状況で配当を支払うのがベストプラクティスかもしれません。

利点は明快さです。タイピングを減らすのが良いと主張する場合は、すべての関数、変数、ファイル、およびすべての文字にできるだけ少ない文字で名前を付けることについてどう思いますか?

また、文字列を返す場合、なぜmain()の前にintを付けるのですか?どちらかといえば、次のことを期待します。

char main(void)

何?なぜ世界であなたはから文字列を返すのmainですか?これを行う理由はまったくありません...

また、main文字列ではなく文字を返すという宣言。

また、関数の最後に0を返す理由についても霧がかかっています。

プログラムは、終了時にオペレーティングシステムに値を返します。その値を使用して、特定のことについてOSに通知できます。たとえば1、ウイルスが見つかった場合、ウイルスが見つから0なかった場合、および2何らかのエラーが発生した場合、ウイルススキャナーが戻る可能性があります。通常、0エラーがなく、すべてがうまくいったことを意味します。

于 2010-05-23T18:07:20.647 に答える
2

この背後にある理由は、何らかの形式のエラー報告メカニズムを提供することでした。したがって、プログラムがゼロ値を返す場合は常に、それは通常、プログラムがタスクを正常に完了したと信じていることを意味します。ゼロ以外の値の場合、プログラムは何らかの理由で失敗しました。時々、その番号は特定のエラーメッセージに対応する場合があります。CでのいくつかのシステムAPI呼び出しは、処理が成功したかどうかを示すために戻りコードを返します。Cには例外の概念がないため、呼び出しが成功したかどうかを判断するための最良の方法です。

于 2010-05-23T18:00:08.403 に答える
1

ほとんどのオペレーティングシステムは、アプリケーションに終了コードを使用します。通常0は、成功の終了コードです(アプリケーションが正常に完了した場合など)。の戻り値はmain()OSに返されるものです。そのため、main()通常は整数が返されます(0成功したため、ほとんどのCプログラムreturn 0;の最後にがあります)。

于 2010-05-23T17:58:19.873 に答える
1

メイン関数宣言の前の「int」は、関数の戻り型です。つまり、関数は整数を返します。

この関数から、データを返すことができます。関数が正常に完了した場合、通常は「0」を返します。プログラムが正常に実行されなかった場合は、発生したエラーを示すために、255までのその他の数値が返されます。

つまり、プログラムが正しく実行されたことを示すために、intデータ型で0を返します。

于 2010-05-23T18:00:24.330 に答える
1

int main(int argc, char * argv[])整数の戻り値はプログラムの実行方法を示すことができるため、これを使用するのが伝統的です。0を返すと、プログラムが正常に実行されたことを示し、-1を返すと、何らかの障害が発生したことを示します。通常、終了コードは非常に具体的であり、例外(C ++の意味で)はCに存在しないため、デバッグの方法として使用されます。

于 2010-05-23T18:00:49.820 に答える