• 締切済み

間違いが存在するみたいなんですが・・・

以下のプログラム、 間違いが存在するみたいなんですが、 MicrosoftVisualC++ でコンパイルしてみても エラー、警告ともに0でちゃんと実行できました。 本当に間違いが存在するでしょうか? #include <stdio.h> int Testfunc(int InputData) { int Ret; if(InputData<100){ Ret=InputData*2; } retrun Ret; } void main() { int InputData; int OutputData; printf("整数入力"); scanf("%d", &InputData); OutputData=Testfunc(InputData); printf("%d\n", OutputData); }

みんなの回答

  • TT414
  • ベストアンサー率18% (72/384)
回答No.8

ANo.3 >> main関数の戻り値はvoidのままでOKだと聞いていたので、 >そういう嘘を信じてはいけません。 >int main(void), int main(int argc, char *argv[])のいずれかでなければなりません。 JIS-Cから引用ここから Page 8(途中省略してあります) 5.1.2.2.1 プログラムの...次の4種類の方法のいずれかで定義しなければならない。 - int main ( void ) { } - int main ( int, char *[] ) { } - 上2つと等価な方法 - 上3つの方法のいずれでもない処理系定義の方法 Page 9(途中省略してあります) 5.1.2.2.3 main関数の返却値の型がintと適合しない場合、ホスト環境に戻される終了状態は、未規定とする。 Page 3 3.4.4 未規定の動作 この規格が、二つ以上の可能性を提供し、個々の場合にどの可能性を選択するかに関して何ら要求を課さない動作。     例 未規定の動作の例としては、関数の実引数の評価順序がある。 ここまで これを読むとvoid main()と書くのは、規格内です。 ANo.4を嘘つき呼ばわりする根拠を教えてください。

  • jacta
  • ベストアンサー率26% (845/3158)
回答No.7

話がどんどん違う方向に進んでいるので(私にも原因がありますが)、改めて質問に直接関係する話題に戻ります。 InputDataが100以上のとき、Testfuncの返却値が未規定になるのはすでに指摘されているとおりです。そして、それを間違いだとするのであれば、scanfでint型の表現範囲を超える数値を入力された場合の動作は未定義ですので、こちらの方がむしろ深刻です。 ところで、JIS-CというかJIS X3010にはいくつかのバージョンがあります。mainの返却値がintでなくても許されるようになったのはJIS X3010:2003からで、これはISO/IEC 9899:1999(通称C99)に対応します。以前のJIS-C、例えばJIS X3010:1997などでは、mainの返却値はint型でなければなりませんでした。ただし、それはホスト環境の場合の話であって、(組込み機器のような)OSの支援を受けないフリースタンディング環境の場合は何でもOKで、プログラムがmain関数から始まる必要すらありません。

  • jacta
  • ベストアンサー率26% (845/3158)
回答No.6

main関数の型についてですが、(非標準処理系である)Microsoft Visual C++に限れば、 http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/vclang/html/_pluslang_program_startup.3a_.the_main_function.asp の最後にもあるように、返却値型はvoidであっても構いません。 また、 http://www.bohyoh.com/CandCPP/FAQ/FAQ00014.html が参考になるかと思いますが、C99やC++であれば、移植性さえ捨てる気なら処理系によっては独自の型で宣言することが認められています。

  • mac_res
  • ベストアンサー率36% (568/1571)
回答No.5

> main関数の戻り値はvoidのままでOKだと聞いていたので、 そういう嘘を信じてはいけません。 int main(void), int main(int argc, char *argv[])のいずれかでなければなりません。 void main()では、OSに返す戻り値が不定となります。

  • TT414
  • ベストアンサー率18% (72/384)
回答No.4

>main関数の戻り値はvoidのままでOKだと聞いていたので、 OKですよ。 No.3の >void main()は誤りです。int main(void)としてください。 は違います、JIS-C以前の規格では規格外かもしれませんが、JIS-Cでは規格内です。

  • mac_res
  • ベストアンサー率36% (568/1571)
回答No.3

retrun Ret;は写し間違いですね。コンパイルエラーになります。 Testfunc()はInputDataが100以上のとき、不定の値を返します。 void main()は誤りです。int main(void)としてください。 すると、main()の戻り値が必要になりますので、 return 0; を付け加えます。 以上まとめて、 #include <stdio.h> int Testfunc(int InputData) { int Ret; if (InputData < 100) { Ret = InputData * 2; } else Ret = InputData; return Ret; } int main(void) { int InputData; int OutputData; printf("整数入力"); scanf("%d", &InputData); OutputData = Testfunc(InputData); printf("%d\n", OutputData); return 0; }

toubousha
質問者

お礼

main関数の戻り値はvoidのままでOKだと聞いていたので、 Testfunc()関数の方で InputData>=100 の処理を追加してやればいいというこですね。 有難うございました。

  • okg00
  • ベストアンサー率39% (1322/3338)
回答No.2

InputDataが100以上の時はどうなりますか? Retを初期化していないので値が不定になり、Testfuncの戻り値が不定に。

toubousha
質問者

お礼

gccではwarningがでるので これですっきりしました。 有難うございました。

  • venzou
  • ベストアンサー率71% (311/435)
回答No.1

何を基準に間違っていると言われているのかが分かりませんが・・ 気になる点を挙げると、 Testfunc() に 100以上の数値を渡すと、戻り値が不定。

toubousha
質問者

お礼

ナルホド、そうですね。 有難うございます。

関連するQ&A