第09問の答え

答え

main()の戻り値が数値になっている!
  return 0; /* 成功 */
main()の戻り値にはEXIT_SUCCESSなどを使うほうがベター!
  return EXIT_SUCCESS;

解説

main()の戻り値は、OSに返却される値です。この値によって、OSはプログラムが正常に処理を終えたのかどうかを判断します。ほとんどの場合、値の意味は次のように決まっています。

  • 0のとき:すべての処理に成功した(正常終了)
  • 0以外のとき:何らかの処理に失敗した(異常終了)

正常終了したときは、main()に次のように書いても問題になることは少ないでしょう。

  return 0;

厳密に言えば、OSに返却する値の意味はOSに依存します。そのため、ポータビリティ(どの環境でもうまく動くこと)を考えれば、数値をじかに書くやり方は望ましいとはいえません。

そこでC言語には、標準で利用できる次の2つの値が用意されています。

  • EXIT_SUCCESS:正常終了を意味する値
  • EXIT_FAILURE:異常終了を意味する値

これらは、<stdlib.h>をインクルードすると使えるようになります。実際のところは「EXIT_SUCCESSとは0のことだ」と思ってほぼ間違いないのですが、次のように書いたほうがプログラムの意図が明確になりますね。

  return EXIT_SUCCESS;
なるべく標準的な書き方をしたほうが、プログラムを作ったときの気持ちが伝わりやすいって感じですかね。
そうそう。気持ちを伝えるって大事なことでしょ?
大事ですねー。
ここがポイント!
標準的な書き方を心がければ、プログラムの意図はもっと伝わりやすくなる!

修正後のプログラム

main.c
#include <stdio.h>
#include <stdlib.h>

void Greet(const char *pName) {
  printf("Hello, %s!\n", pName);
}

int main(int argc, char *argv[]) {
  if (argc < 2) {
    puts("No input.");

    return EXIT_FAILURE;
  }

  for (int i=1; i<argc; i++) {
    Greet(argv[i]);
  }

  return EXIT_SUCCESS;
}
実行結果
↓コマンドライン引数が「Leo Yuki」の場合:
Hello, Leo!
Hello, Yuki!

↓コマンドライン引数なしの場合:
No input.