• 締切済み

C++言語のmain関数の戻値について

WindowsでVisualC++を使っています。int main() {~return 0;} で正常終了ですが、int main(){~return 1;}と0以外の数値を返してしまった場合、OSは何か処理をするのでしょうか?何かゴミ・スレットや、プログラムがメモリに残ったり、問題が残るのでしょうか? よろしくお願いします。

みんなの回答

  • hiodraiu
  • ベストアンサー率15% (448/2823)
回答No.5

mainの戻り値は、単体で動くプログラムならどうでもいい話ですね。 一般的にはシェルから、そのプログラム起動して、プログラム終了後にシェルで戻り値を取得して、その後の処理に使うってのが、よくある使われ方だと思います。

  • notnot
  • ベストアンサー率47% (4848/10262)
回答No.4

プログラムの動作に影響はありません。プログラムが終わった後に、そのプログラムを呼び出したプログラムで、returnの値を取得できます。 コマンドプロンプトから起動した場合は、環境変数%ERRORLEVL%にその値がセットされます。 Explorerから起動した場合は知る手段は無いと思います。 returnを書かないと、呼び出し元が受け取る値は不定ですが、プログラムの動作に影響はありません。 > IF ERRORLEVEL==1 GOTO NORMAL > IF ERRORLEVEL==0 GOTO EXCEPTION 書き方が、間違ってますね。それぞれ=は無視されて、1つめは「ERRORLEVELが1以上なら」、2つ目は「ERRORLEVELが0以上なら(=常に)」という意味になります。知っている人はそう読めますが、知らない人だと「ERRORLEVELが1に等しいときは」「ERRORLEVELが0に等しいときは」と勘違いするでしょう。 イコールで比較したかったら、 IF %ERRORLEVEL%==1 GOTO NORMAL IF %ERRORLEVEL%==0 GOTO EXCEPTION です。

  • asuncion
  • ベストアンサー率33% (2126/6288)
回答No.3

>main()関数の最後にreturnがあってもなくても基本的には関係ありません。 ホントですか? main関数の戻り値がint型であると規格で決まっている以上、 int型の何らかの値を戻す必要があるはずです。 戻した値をどのように使うかはやりたいことしだいってことで。

  • bardfish
  • ベストアンサー率28% (5029/17765)
回答No.2

main()関数の最後にreturnがあってもなくても基本的には関係ありません。 main()の最後のreturnの値は、main()関数でリンクされた実行プログラム、Windowsなら.exeファイルですが、それをバッチファイルで呼び出し、exeの戻り値(main関数のreturnの値)の結果によってIF文で分岐させることができます。 【example.bat】 example.exe IF ERRORLEVEL==1 GOTO NORMAL IF ERRORLEVEL==0 GOTO EXCEPTION ECHO 未知の戻り値 :END_LABEL PAUSE END :NORMAL ECHO 正常終了 GOTO END_LABEL :EXCEPTION ECHO 異常終了 GORO END_PROC って感じだったと思います。 >int main() {~return 0;}で正常終了ですが べつに戻り値0だから正常ってわけではありません。 「0だったら正常とする」と決めているだけで、ナニが正常かは仕様によって決めます。 殆どの場合は無意味なんですけどね。

  • f272
  • ベストアンサー率46% (8018/17137)
回答No.1

そのcプログラムを呼びたしたプロセスが決めることです。まあ、よく見かける環境では何もしませんし、何の問題もおこしません。

関連するQ&A

  • C言語でmain関数でのreturnとexit

    C言語でmain関数でのreturnとexitは同等とされてますが、 それは『プログラムを呼び出した元の動作』も同じですか? 例えばshellやOSから見て、割り当てメモリ開放などの点で returnで終了したプログラムの後処理と exitで終了したプログラムの後処理は 全く同じになりますか?

  • main関数の戻り値

    C言語のmain関数の戻り値はint型ですよね。 私もそういう決まりだと思って守ってきました。 しかし、「mainが戻り値を返すって、どこに返すの?」ということが、私は理解できていません。 私が調べたところでは、「ホスト実行環境」という言葉がこの問題に関係あるようですが、この言葉の意味はよくわからないですし、似た言葉で「ホスト環境」ということばがあるのですが意味も関係もわかりません。 これらは、OSとは違うと思うんですが、自信はありません。 それでも、ない知識を振り絞っていろいろ考えてみると、次のようなことらしいのですが、正しいでしょうか。 ・OSはプログラムの実行に先立ちホスト実行環境を作る。 ・静的記憶域のオブジェクトを初期化するのはホスト実行環境である。 ・関数が、main関数を呼ぶことは可能である。(以下では、main関数が関数から呼ばれる場合は除く。) ・main関数を呼ぶのは、ホスト実行環境が行なう。 ・main関数の中のreturnによってプログラムが終了するのと、exit関数でプログラムが終了することに違いはない。 ・main関数の戻り値は、ホスト実行環境に返される。 ・returnによってホスト実行環境に返される値は、int型である限りなんでもよい。 ・exitによってホスト実行環境に返される値は、int型である限りなんでもよい。 ・必ずexitで値が返されるならば、main関数の中にreturnはなくてもよい。 main関数からの戻り値をどうしようと構わないんだと思うんですが、皆さんの経験の中で、実例としてこういうふうに使われる、というのは何かないのでしょうか。 (ホスト実行環境に値が返される、といっても無視するのでは意味はないと思うのです。 その値の使用例としては、 0が返ってくると「プログラムは正常終了しました。」と表示するとか、0以外の値が返されると別のプログラムが走るとか、 そういうことだと思うんですが。)

  • C言語 main関数とsum関数の記述順について

    はじめまして。 【苦しんで覚えるC言語】(Web版)でC言語を学んでいる初学者です。 【第1部:C言語基礎編】>【関数の作り方】>【自作関数を作る】の部分(http://9cguide.appspot.com/11-01.html#S2)でつまづいています。 下記のような、1から100までの数字の合計を表示するプログラムが例題として取り上げられています。 しかし、ここが理解できないので、次の【プロトタイプ宣言】に進めずにいます。 例題1  sum関数をmain関数の後に記述した場合(プログラムが実行されない)。 #include <stdio.h> int main(void) { return 0; } int sum(void) { printf("%d\n",(1 + 100) * 100 / 2); return 0; } 例題2  sum関数をmain関数の先に記述した場合(プログラムが実行される)。 #include <stdio.h> int sum(void) { printf("%d\n",(1 + 100) * 100 / 2); return 0; } int main(void) { return 0; } 例題1の場合、【まずmain関数を作り、次にsum関数を作りました。この場合、main関数を解析している段階では、sum関数は発見されておらず、従って、main関数の中では、sum関数を使うことは出来なくなってしまいます。】との説明がありますが理解できません。 コンパイラがどのような順番でプログラムを処理しているか理解できていないので分からないのだと思います。 例題1の場合と例題2の場合の両方について、コンパイラがどのような順番でプログラムを処理しているのかを具体的に教えてください。 どうかよろしくお願い致します。

  • [C言語] main() の後ろ "{"の場所は?

    こんにちは。 C言語のおなじみのプログラムですが、下記2パターンの書き方というか考え方があるんだと思います。 そして、どちらを選ぶかで、いろんなところへ影響することが考えられます。 基本は、どちらなんでしょう? ■パターン1 int main() { printf("Hello World!\n"); return 0; } ■パターン2 int main() { printf("Hello World!\n"); return 0; } たった"}"だけの場所のことですが、皆さんの考え方を伺いたくてスレを立てました。 持論でももちろん結構ですので、よろしくお願いいたします。

  • c言語の関数について

    .#include<stdio.h> int input_number(void); int main(void) { int num; int total = 0; while(){ num = input_number(); if(num == 0){ break; } total = total + input_number(); } printf("¥n合計値は%dです¥n", total); return 0; } int input_number(void) { int num; printf("数値を入力してください: "); scanf("%d", &num); return num; } 個人でcを勉強しております。 このプログラムで間違っているところを教えていただけませんでしょうか? 苦戦して困っております。できれば勉強法も教えてていただきたいです。 どうか宜しくお願いします。

  • プログラムがmain関数から始まらない??

    C言語初心者です。よろしくお願いします。 return文について勉強している途中だったのですが、次のプログラムを実行してみたところ、わからないことが出てきたので質問させていただきました。(ほとんど自分で作ったプログラムではないです) #include <stdio.h> /* 関数a()はintを返すと指定 */ int a() {     if (1) {          /* ここで関数a()は終わります */          printf("yes1\n");          return 300;     }     pritnf("yes2\n");     /* ここは通りません */     printf("this is a()\n");     return 10; } int main() {     int i;     /* 関数a()の返り値を変数iに代入します */     i = a();     printf("i = %d\n", i);     return 0; } このプログラムの出力結果は yes1 i = 300 となるのですが、 1.以前「main関数からプログラムは開始する」というようなことを学習したのですが、このプログラムではyes1が出力されていることからa関数からプログラムが始まっていませんか? 2.a関数のif文の中のreturn 300;でプログラムが終了しないのはなぜですか? 知識のある方、どうか教えてください。 よろしくお願いします。 ※ このプログラムを表示させる際、Tabキー及び半角では適度な空白スペースを作ることができなかったので、プログラムを見やすくするための空白スペースは全て全角スペースで作ってあります。(もしかしたら普通に表示させる方法があるのかもしれませんが、わかりませんでした。)

  • "main"について

    "main"についての質問です。 今まで私は"main"というのはC言語の予約語の一つだと思い込んでいましたので、"main"は変数名には使えないと思っていました。 ところが以下のようなプログラムを実行してみると問題なくコンパイル出来る上に問題なく実行できました。 int main(void) { int main; main = 300; printf("%d\n", main); return 0; } 確かに入門書などを見直してみると、予約語の中に"main"はありませんでしたし、関数名が変数名として使えないとは書いて無いように思います。 でもなんだかしっくりきません。(^^;) 関数ポインタを使う際などは、変数=関数名(p = myfunction)などと書いたりするので、main関数が格納されているメモリなど変なところを書き換えたりしている可能性があるような気がしたのですが、うまく確認する方法を思いつきませんでした・・・。 ただたんに変数が優先的に処理されているだけというのなら納得するしかないのですが。 どなたか詳しい方がいたら教えてください。よろしくお願いします。

  • C言語のユーザ関数の問題の質問です。

    以下のような実行結果が得られるプログラムを作りたいのですが・・・。 数値入力==>3 数値入力==>5 数値入力==>1 数値入力==>2 数値入力==>4 数値入力==>-1 合計:15 ←メイン関数で表示。 int dat[10]; ←main関数で定義。 実際に作ってみました。 #include <stdio.h> int MyArraySum(int cnt,int *pt); void main(void) { int dat[10],gokei,indat; int i; printf("数値入力==>"); scanf("%d",&indat); gokei=0; while(indat!=-1 && indat<11) { printf("数値入力==>"); scanf("%d",&indat); } MyArraySum(indat,dat); printf("合計:%d\n",gokei); return; } int MyArraySum(int cnt,int *pt) { int gokei; gokei=cnt+*pt; return gokei; } どうやっても、合計が0になってしまいます。 ご教授お願いいたします。 ちなみにアドレス渡しでやることが条件なので*使ってます。

  • main関数の戻り値について

    c言語において、main関数の戻り値は何を意味しているのですか。 また、void型にすれば、main関数の戻り値を書かなくても問題無いでしょうか。 また、関数はreturn文を書かなくても、最後まで処理を実行すると終了するらしいですが、void型にすれば、main関数でreturn文を書かなくても問題無いでしょうか。

  • main関数の事についてお聞きします。

    Windowsのプログラムを書くとき、下のようにキッチリ戻り値や引数を書かなくてはならないのに int WINAPI WinMain( HINSTANCE hInstance, // 現在のインスタンスのハンドル HINSTANCE hPrevInstance, // 以前のインスタンスのハンドル LPSTR lpCmdLine, // コマンドライン int nCmdShow // 表示状態 ); C言語で書かれたプログラムは int main(int argc, char *argv[]) ではなく、 int main(void) や void main(void) または int main() や main() だけのモノなど、 いろいろです。 main関数は、関数なのに戻り値や引数を省略して書ける仕様なのは、なぜなのか? ちょっと疑問に思ったのでこちらにお尋ねしました。

専門家に質問してみよう