6

C89では、次のように、Cプログラムのmainから常に0の整数値を返すのが慣例であることがわかっています。

int main() {

    /* do something useful here */

    return 0;
}

これは、「成功した」結果をオペレーティングシステムに返すためのものです。私はまだ自分自身をCの初心者(またはせいぜい中級プログラマー)だと思っていますが、これがなぜ重要なのかを完全に理解したことはありません。

私の推測では、これは、このプログラムの出力を別のプログラムの入力に結び付ける場合に役立つ結果ですが、よくわかりません。私はそれが有用だとは思っていませんでした、あるいは私はその意図が何であるかを理解していないだけかもしれません。

私の質問:

  1. Cプログラムから常にゼロを返す必要がありますか?
  2. からの戻り値はどのようにmain()役立ちますか?
4

7 に答える 7

7

スクリプトを作成する場合(BashやWindowsのCMD.exeなど)、&&および||を使用していくつかのコマンドを連鎖させることができます。演算子。

正規にa && bb、の結果aがゼロの場合にa || b実行され、ゼロ以外の場合に実行されます。ba

これは、前のコマンドが成功した場合に条件付きでコマンドを実行する場合に役立ちます。たとえば、fooという単語が含まれているファイルを削除したいとします。次に、使用します:

grep foo myfile && rm myfile

grep一致した場合は0を返し、それ以外の場合はゼロ以外を返します。

于 2010-09-25T11:08:53.220 に答える
2

0を返すのは慣例です。プログラムが0を返す場合、プログラムが何をしたかを実際に確認しなくても、正常に機能したと見なすことができます(ahem:D)。

広く使用されている慣習として、その仮定は多くの場所にあります。Benoitが指摘しているように、これはシェル(UNIXおよびWindows)およびオペレーティングシステムの他の部分の場合です。

だからあなたの質問に答える:

  1. Cプログラムの場合、EXIT_SUCCESSまたはEXIT_FAILUREのいずれかを返す必要があります。ただし、プログラムが正常に機能した場合でも、EXIT_FAILUREを返すことができます。
  2. 0(EXIT_SUCCESS)を返さない場合、他のプログラムがプログラムが失敗したと見なす可能性があります。

C++とCのすばらしい応答に関連する質問があります

main()はCおよびC ++で何を返す必要がありますか?

于 2010-09-25T12:39:27.513 に答える
2

最新のC別名C99(C89については不明)では、の3つの終端はmainすべて同等です。

  • main最後に終わります}
  • return 0
  • exit(0)

このすべての背後にある考え方は、(他の人が述べたように)呼び出し側プログラムに復帰ステータスを与えることです。

于 2010-09-25T11:30:58.573 に答える
1

戻り値はプログラム実行の「結果」であり、0は正常終了を示し、ゼロ以外の戻り値は失敗または予期しない終了を示します。

プログラムを通常どおりに呼び出す場合、戻り値はシステムにとって実際には重要ではありませんが、2つの目的があります。それらの1つはデバッグです。C ++で最も一般的に使用されるコンパイラであるMSVCでは、実行が終了した後にプログラムが値を返すことがわかります。これは、プログラムが「どのように、そしてなぜ」終了したかを確認するのに役立ちます。

もう1つの用途は、アプリケーションが他のプログラムから呼び出された場合です。ここで、戻り値は成功を示したり、結果を渡したりする場合があります。

于 2010-09-25T11:18:25.940 に答える
0

ひや、あなたが言ったように、主にプログラムがより広いプログラムネットワークの一部として使用される場合。プログラム環境にゼロを返すと、ネットワークはすべてがうまくいったことを知ることができます(あなたが言ったように)が、1、2、3 ...(発生したエラーに応じて)を返すようにして、コードのネットワークに何かを知らせることもできます間違っています。同様に、「main」プログラムの最後にexit(0)またはexit(1)を設定して、まったく同じことを行うことができます。これが役立つ場合があります:http: //en.wikipedia.org/wiki/Exit_statusお 役に立てば幸いです。ジャック

于 2010-09-25T11:20:25.527 に答える
0

プログラムが正しく終了した場合はEXIT_SUCCESSを使用し、終了しなかった場合はEXIT_FAILUREを使用する必要があります。EXIT_SUCCESSはゼロであり、ゼロは任意のオペレーティングシステムに移植可能ですが、たとえば、EXIT_FAILUREはUNIXからWindowsに変更されます。これらの定数はstdlib.hヘッダーで定義されています。

#include <stdlib.h>

int main()
{

    int toret = EXIT_SUCCESS;

    if ( !( /* do something useful here */ ) ) {
        toret = EXIT_FAILURE;
    }

    return toret;
}

プログラムがコンソール用に作成された場合、プログラムの戻りコードはより有用でした。今日では、非常に専門的な環境で作業している場合を除いて、それは非常にまれです(そして、ワークフローツールが利用可能になったことで、これも変化しています)。

@Benoitが言ったように、終了コードは、操作が成功したかどうかをオペレーティングシステムに通知します。終了コードが失敗を意味する場合は、うまくいかない可能性があるため、バッチプログラムのフローを中断できます。

たとえば、コンパイラーは、コンパイルが成功した場合はゼロの終了コードを持ち、コンパイルが失敗した場合は別の値を持つことができます。Windowsでは、これはオペレーティングシステム変数「errorlevel」を介してアクセスできます。

gcc helloworld.cpp -ohelloworld.exe
goto answer%errorlevel%
:answer0
copy helloworld.exe c:\users\username\Desktop
echo Program installed
goto end
:answer1
echo There were errors. Check your source code.
:end
echo Now exiting...

このWindowsバッチファイルは、コンパイルが成功したときにhelloworld.exeをデスクトップに「インストール」します。ダブルクリックでバッチファイルの実行をトリガーできるため、コンパイルのためにコマンドラインに触れることを回避できます。

もちろん、統合環境によってより適切に管理されることを考慮に入れてください(終了コードが存在しない場合、それらは正しく機能しません)。また、 makeはこの分野で最適であることに注意してください。

https://en.wikipedia.org/wiki/Make_(software)

正しく実行するには、終了コードも必要です。

于 2010-09-25T12:08:36.373 に答える
0

から任意の整数を返すことができmain()ます。現在、特定の値を返す関数main()について明示的に言及していない場合、デフォルトで関数は0を返します。main()

return 0は、実際には、プログラムがルールではありませんが、エラーなしで正常に終了したことに似ていますが、これが動作方法です。

また、ゼロ以外の数値を明示的に返すと、プログラムは正しく実行されますが、内部的には、プログラムがエラーで終了したか、プログラムが予期しない結果で終了したことを意味します。これは、現在のプログラムに基づいて別のプログラムが呼び出された場合に役立ちます。プログラムは「&&」または「||」を使用して値を返します コマンドラインで。

次のコマンドを使用して、Linuxで以前に実行したプログラムの戻り値を確認することもできます。

echo $?
于 2017-01-06T14:57:39.790 に答える