ANSI-C言語に関することです。
ベンダー拡張やOS固有機能は除外してください。

よく、書籍でvoid main(void)と書いたサンプルを見かけます。
プログラミング言語Cではint main(void)だし、C言語FAQでも「void main(void)は間違いである」と書いてあるのに…。
過去の質問への回答で「ANSI-Cでは…」と解説している人がいたのでANSI-Cの仕様を調べてもint main(void)の方が正しいように書かれていました。

これだけ資料が揃っているのにいまだにvoid main(void)と書かれた書籍がイッパイあるのはなぜなんでしょう?
最初にvoid main(void)って書いた人がものすごく影響力のある人だったのか?と想像してしまいます。
いったい誰が最初にvoid main(void)と書き始めたのでしょうか?

このQ&Aに関連する最新のQ&A

A 回答 (4件)

 昔は『プログラミング言語C』が void main(void) と書いていたからです。



 この本はC言語を開発したDr.KernighanとDr.Ritchieが1978年に発表したものです。
 言語設計者が自ら開発した本として大きな影響力を持ち、「K&R本」と呼ばれて親しまれてきました。

 しかしK&R本の内容では、言語設計として曖昧な部分、不適切な部分もありました。そこで言語設計を洗いなおしたのが1988年のANSI規格です。

 同じころにK&R本もANSI規格に合致するように内容を改定して、『プログラミング言語C 第2版』として再発表されました。

 共立出版から出ている和訳本も、初めは第1版の翻訳でしたが、ANSI以降は第2版の翻訳になっちます。

 しかし我々は、日本語でもそうですが言語習慣というものはなかなか変えられません。だから今でも(コンパイラが許すなら)void main(void)と書く人もいるわけです。

参考URL:http://www.bohyoh.com/CandCPP/C/history.html
    • good
    • 0
この回答へのお礼

回答ありがとうございました。
第一版を読んだことはあるんですがvoid main(void)だったことはぜんぜん覚えてません。
第一版を読む前にカーニハン&パイクの『UNIXプログラミング環境』を読んで「mainはintなんだ」と先入観があったからかな。

参考URL読みましたけど、このページの内容もヤバイくらい間違ってますね。

お礼日時:2001/07/12 16:03

実際に「プログラミングする人」に関してではなく、「参考書/教則本の著者」に関する話題ですよね。



実際のプログラミングの現場では“OS固有の機能”または“コンパイラのベンダー拡張”によってvoid型のmainが許容されることが多いと思います。
その点はchaosheroさんもご存知だから「ANSI-C言語に関することです。 ベンダー拡張やOS固有機能は除外してください。 」と断っておられるのでしょう。

歴史的に見た場合amajunさんのおっしゃることが答えになると思います。
と言っても私も第一版は捨ててしまっているので確認したわけではありません(しかもうろ覚え)。

> これだけ資料が揃っているのにいまだにvoid main(void)と書かれた書籍がイッパイあるのはなぜなんでしょう?
この部分は単純です。
著者が良く理解できていないからです。
hosted environmentとfree standing environmentの違うすら理解できていないのでしょう。
本来、この手の人たちは教則本を書くべきではないのですが「言葉がやさしい」、「図や絵が多い」といった(本質的でない)理由によって受け入れられてしまっているため発行部数が伸びてしまい、「『発行部数の多い本は良い本だろう』という誤解を生んでまた売れる」という悪循環が生まれてしまうのでしょう。
また、本来チェック機間である筈の出版社がチェックしきれていないのも問題です。
より大きな問題として「コンピュータ教育している人たちが理解できていないので教科書にその手の本を採用する」ということもあります。

私は専門学校でC/C++を教えているのですが、担当が2年生であること&非常勤であることで1年生の教科書選定に加わることが出来ません。
結果として、毎年最初の授業で「1年生の教科書は捨てろ!1年生の授業と2年生の授業の内容が違ったら俺が正しい!」という洗脳からはじめるハメになっています。
2年生の最初の1ヶ月でCの文法を全て教えなおすという異常な状況です。

教科書/教則本は「実際的なもの」と「原則的なもの」があるべきです。
その意味で『ANSI-C準拠』と書かれたものにvoid main(void)とあれば、その本は駆逐されるべきでしょう。
実際的な本(特定のコンパイラの解説書など)では許されると思います。

完全に余談ですが…
今年の1年生の教科書は『ANSI-C準拠』と書かれていますがターゲットコンパイラがLSI-C86(ANSI-Cに完全準拠してないって!)でvoid main(void)と書かれたサンプルが載っています。
    • good
    • 0

歴史的なことには詳しくないのですが、main 関数の使い方として


void main の方が自然だからではないでしょうか?

つまり、宣言は void main、終了する時は return ではなく exit 関数を
使い、その引数が呼び出し元に戻される、というスタイルですね。
多くの処理系では main で return n; とすれば exit(n); と同じ動作を
しますが、私は、この書き方はほとんど見かけたことはありません。

この回答への補足

mainの型の問題とexitで値が返せることは別問題ですね。
C言語FAQでも「OSが値を受け取るかどうか、exitで値を返せるかどうかとmainがintであることは関係ない」と書かれています。

また、実際のプログラミングでvoid main(void)と書くのと書籍にvoid main(void)と書くのでは影響力に違いがあると思います。
実際のプログラミングでは「OS機能やベンダ拡張を利用するのは(場合によっては)当たり前」でしょう。
書籍(toysmithさんが言う原則的な本)でvoid main(void)と書くのは「ANSI-C規約に違反した書き方を紹介する」ことであり、ウソを書いていると言われても仕方ないと思います。

補足日時:2001/07/13 12:35
    • good
    • 0

すみません、訂正。



> 言語設計者が自ら開発した

 「言語設計者が自ら執筆した」

> 翻訳になっちます。

 「翻訳になっています。」
    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Q初心者がまず始めるプログラミング言語はなにはおすすめ?

こんにちは。
プログラムについてほぼまったくの初心者です。
シューティングゲームやファミコンの頃のようなマリオ系アクションがつくりたいです。また、就職時や特技として履歴書に書ける、役に立つプログラミング言語が学びたいです。
使っているOSはXPです。
C言語というものの初歩の初歩を本で学んだんですが、とても難しく感じ、途中で挫折してしまいました。
たくさんあるプログラミング言語の中から、初心者にもわかりやすくて、また、他のプログラミング言語への勉強にもなるようなプログラミング言語はあるでしょうか?
おねがいします。

Aベストアンサー

> C言語というものの初歩の初歩を本で学んだんですが、とても難しく感じ、途中で挫折してしまいました。

 厳しいですね。C言語の初歩程度でへこたれているようでは「就職時や特技として履歴書に書ける、役に立つプログラミング言語」のマスターはおぼつかないでしょう。が,C言語が初心者向きでないのもまた事実です。

 私としては,初心者には Python をお奨めします:

  ‐汚いプログラムが書きにくいような文法になっており,ああも書ける,こうも書けるといった,初心者を戸惑わせる文法事項が少ない
  ‐綺麗なプログラムを書かないと気持ち悪くなるという,良い習慣が身につく
  ‐文法が比較的単純
  ‐処理系が無料で手に入る
  ‐世界的に広く使われている
  ‐オブジェクト指向もできる

 その後で,JavaScript に進んでみてはいかがでしょうか。毛色の異なるいろいろな言語に慣れておく必要があり,将来,Java, C#, C, C++ などの言語に進むためにも。

 また,視野を広げるために Scheme, Common Lisp や ML, OCaml, Haskell, Erlang など関数言語のたぐいや,Perl や Ruby, sed, Awk などのスクリプト言語の本にも目を通されることをお勧めします(いずれも世界的に有名で,処理系が無料で手に入ります)。

 それから Java や C# などに取り組めば良いと思います。そして,C や C++ も勉強しておく必要があります。

 私自身は,仕事の都合でCOBOLとアセンブラを先に勉強し,かなり後になってC言語を勉強したので,C言語のポインタのどこが難しいのか分かりませんでした(C言語のポインタは簡単です(^^;)。ただし,アセンブラは余力があるときに限り取り組めばよいでしょう(でも,CASL関連の本には目を通しておくべき)。

> C言語というものの初歩の初歩を本で学んだんですが、とても難しく感じ、途中で挫折してしまいました。

 厳しいですね。C言語の初歩程度でへこたれているようでは「就職時や特技として履歴書に書ける、役に立つプログラミング言語」のマスターはおぼつかないでしょう。が,C言語が初心者向きでないのもまた事実です。

 私としては,初心者には Python をお奨めします:

  ‐汚いプログラムが書きにくいような文法になっており,ああも書ける,こうも書けるといった,初心者を戸惑わせる文法事項が少...続きを読む

Qint main()、void main()、void main(void)、int main(void)

今日、大学でC言語の講義の時間、先生が、

#include <stdio.h>

void main(void){

}

と宣言してプログラムを書くと教えていました。
main関数には、
main()
void main()
void main( void )
int main()
int main( void )

と、人によりいくつかの描き方があったりします。
どれが本当は正しいのでしょうか?
void mainはすべきではないとなんかの本で読んだのですが・・。

Aベストアンサー

通称C89という以前の言語規格(現行コンパイラの多くが準拠)では、下記のいずれかが正しい。
int main(int argc, char *argv[])
int main(void)

但し、最新のC言語規格(通称C99)では、
<ISO/IEC9899:1999>
or in some other implementation-defined manner.
</ISO/IEC9899:1999>
となっているので、処理系が戻り値のvoidを認めていればvoidも可。
# 組込み系などで戻り値を使わない環境もあるためでしょうか。

なので、コンパイラのマニュアルで戻り値のvoidにしていい/しろと書いてない限り、
voidは言語仕様的には正しくない。(でも動くものもある)

Q初心者が選ぶべきプログラミング言語は?

初心者が選ぶべきプログラミング言語は?

プログラミングの勉強を始めようと思っている超初心者です。この手の質問はこちらでもかなり検索すればヒットしますが、いまいち良くわからないのであえて質問します。

私のような初心者がプログラミングをはじめるときどの言語を選んだらよいでしょうか?
重視することは「将来性があって」「有用性のある」「標準的な」言語です。
言語選びにはしたいことの明確なビジョンがないといけないと言われますよね
私の目的はwindowsのフリーソフトのようなツールを作りたいことを第一目標にしています
後々は勉強の具合により目的も変えてゆきたいと思っていますが・・・

今現在の理解では・・・
基礎はCで、ビジネスではJavaで、WebはPHP、ぐらいしか解りません。どれもプログラミングの共通点を
有していて勉強すればある程度は共通知識を身につけられることも言われてはいますが
言語選びを間違えたくないなと思いまして。

Cをすこし勉強したときいつwindowsアプリのようなウィンドウをつくれるかももわかりませんでした。
現在自分ができることといったらExcelでVBAを組んで(かなり低レベルですが)自動化させる程度です。


ビジネスの世界、SEなどのプログラマーの世界で今注目されている言語や花形言語など、現在業界のオーバービューも知りたいです、詳しい方どうぞよろしくお願いします。

※個人的にはRubyが面白そうで、いろんなことができそうだなと思っています。

初心者が選ぶべきプログラミング言語は?

プログラミングの勉強を始めようと思っている超初心者です。この手の質問はこちらでもかなり検索すればヒットしますが、いまいち良くわからないのであえて質問します。

私のような初心者がプログラミングをはじめるときどの言語を選んだらよいでしょうか?
重視することは「将来性があって」「有用性のある」「標準的な」言語です。
言語選びにはしたいことの明確なビジョンがないといけないと言われますよね
私の目的はwindowsのフリーソフトのようなツールを作りたい...続きを読む

Aベストアンサー

私は10数年Windows用のクライアントソフトを開発していますが・・・

>重視することは「将来性があって」「有用性のある」「標準的な」言語です。



>私の目的はwindowsのフリーソフトのようなツールを作りたいことを第一目標にしています

が、合致しません。

WindowsというクライアントPC 用のアプリ開発自体が、「将来性がなく」「標準的でない」方向にあると思います。エンジニアの求人情報を調べればわかります。


それから、身につけたい技術の選び方として、「言語」はあまり意味がないです。
C言語をマスターしたからといって、WindowsやiPhoneで思い通りにソフト開発ができるわけじゃないです。

なので、最初は「どのプラットフォームの開発を身につけたいか」を決めた方が適切なアドバイスがもらえると思います。

Windows?iPhone?Webアプリ? SaaS系?などなど

プラットフォームが決まれば、今習得すべき言語は(本人の希望によらず)勝手に決まってしまいます。AndoroidならJavaとか。

「将来性」はともかく、Windowsアプリを作りたいのであれば、.NET Framework で VBでもC#でもお好きな方を使って開発するのが一般的ですが、それでもハード性能を100%使い切るばりばりの3Dゲームソフトを作りたいなら Win32API & C++ & DirectXでどうぞ、という感じです。その前にWindowsで3Dゲームを作ること自体が今となっては疑問です。XBOX + XNAの方がいいかもしれません。
将来性をもってゲームを作りたいなら、AndroidやiPhone で OpenGLアプリを勧めたいですね。

という感じで、言語を選ぶこととプラットフォームを選ぶことは別で、多くの場合プラットフォームが決まれば最適な言語をマスターするしかないということです。

私は10数年Windows用のクライアントソフトを開発していますが・・・

>重視することは「将来性があって」「有用性のある」「標準的な」言語です。



>私の目的はwindowsのフリーソフトのようなツールを作りたいことを第一目標にしています

が、合致しません。

WindowsというクライアントPC 用のアプリ開発自体が、「将来性がなく」「標準的でない」方向にあると思います。エンジニアの求人情報を調べればわかります。


それから、身につけたい技術の選び方として、「言語」はあまり意味がないです。
C言語を...続きを読む

QC言語 int main(void) main()

C言語のmain関数について、質問させていただきます。

私の手元に、林 晴比古さんが執筆された著書、
2007年度版の新C言語入門 スーパービギナー編 (C言語実用マスターシリーズ) [単行本]
http://www.amazon.co.jp/gp/product/4797325631/ref=oh_details_o04_s00_i00?ie=UTF8&psc=1
があります。

これと同一の2000年度版の著書、
http://www.amazon.co.jp/%E6%96%B0C%E8%A8%80%E8%AA%9E%E5%85%A5%E9%96%80-%E3%82%B9%E3%83%BC%E3%83%91%E3%83%BC%E3%83%93%E3%82%AE%E3%83%8A%E3%83%BC%E7%B7%A8-C%E8%A8%80%E8%AA%9E%E5%AE%9F%E7%94%A8%E3%83%9E%E3%82%B9%E3%82%BF%E3%83%BC%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA-%E6%9E%97-%E6%99%B4%E6%AF%94%E5%8F%A4/dp/4797306718/ref=sr_1_cc_1?s=aps&ie=UTF8&qid=1383091260&sr=1-1-catcorr&keywords=%E6%96%B0C%E8%A8%80%E8%AA%9E%E5%85%A5%E9%96%80+%E3%82%B9%E3%83%BC%E3%83%91%E3%83%BC%E3%83%93%E3%82%AE%E3%83%8A%E3%83%BC%E7%B7%A8
も、所持しています。

main関数の書き方が、2007年度版の新しい方では、
int main(void)
{
}
と記載されており、
2000年度版の古い方では
main()
{
}
と記載されています。

改訂版なので両者を同じページで内容や例題を照らし合わせても、この部分が変わっていることを確認できます。
つまり、2007年度版では、2000年度版では書かかなくてよかった「void」を、一新して記載するようになっています。

ここで質問ですが、両方のやり方で、コンパイルすると両方ともエラーなくきちんと表示されます。しかしこれはどのような理由で変更されたのでしょうか?

詳しい方がいましたら、ご回答よろしくお願い申し上げます。

C言語のmain関数について、質問させていただきます。

私の手元に、林 晴比古さんが執筆された著書、
2007年度版の新C言語入門 スーパービギナー編 (C言語実用マスターシリーズ) [単行本]
http://www.amazon.co.jp/gp/product/4797325631/ref=oh_details_o04_s00_i00?ie=UTF8&psc=1
があります。

これと同一の2000年度版の著書、
http://www.amazon.co.jp/%E6%96%B0C%E8%A8%80%E8%AA%9E%E5%85%A5%E9%96%80-%E3%82%B9%E3%83%BC%E3%83%91%E3%83%BC%E3%83%93%E3%82%AE%E3%83%8A%E3%83%BC%E7%B7%A8-C%E8%A8%80%E8%AA%...続きを読む

Aベストアンサー

本当に「詳しい人」に聞きたいなら, こんなところに質問するのではなく出版社に問い合わせるべきではないかな. 著者自身がここを見てるかどうかわからないし, よしんば見て回答していたとしてもそれが本当に「著者の回答」なのか, 判断のしようもないでしょ?

まず 1つ考えられるのが「お行儀」. 引数リストの void は「今の場合は」書かなくてもいい (書いてあるかどうかで意味の変わる場面は存在する) し, 返り値の型も「省略されていれば int」と推定するので書かなくてもいい. でも, いろいろ考えた結果「引数がないときには void と書く」とか「返り値の型は int であっても書く」とかしたんじゃないかな.... 手元にその本は (どっちの版も) ないので確認できないんだけど, 前の版で main の中に return 文はありますか?

もう 1つ, 返り値の型を書くようになった理由としては C++ の絡みも考えられます.

まあ今から勉強するならどちらも書かない理由はないわけですが.

Q僕は高校生なんですがプログラミング言語を将来のために学びたいと思っています。まだ初心者なので調べた結

僕は高校生なんですがプログラミング言語を将来のために学びたいと思っています。まだ初心者なので調べた結果RubyかPythonのどちらかにしようと思うのですがどちらがいいでしょうか?
なるべく多くの意見を参考にしたいです。

Aベストアンサー

入門書とか入門サイトとか少し読んでみて、直感的に「なんとかなりそう」と思った方。
悩んでないで、直感を信じてとにかく始めることです。


プログラムは大きく
・やろうとしていることをどうやって実現するか?
・それをプログラミング言語でどうやって記述するか?
の2つの要素があります。

前者の「やり方」は、言語によろ違いが少ないので、一度身に付くと、言語が変わっても応用が効きます。
後者の「書き方」は(多少似たところはあるものの)言語毎に違うので、「やり方」程は応用が効きません。

「最初の言語」はどうしても「やり方」「書き方」の両方を学習しなければなりません。
ですが、次からは「書き方」中心の学習になるので、「最初の言語」ほどは苦労しないはずです。


なので、とにかく早く始めて、「やり方」を身に付けていきましょう。
直感がはずれて、「この言語は無理」と感じたとしても、「次の言語」へは1から始めるよりははるかに楽になっているはずです。

Q「void ( *signal(int sig, void (*func)(int)) ) (int)」の (int)

signal関数の書式についてですが、

  void ( *signal(int sig, void (*func)(int)) ) (int);

最後に付く(int)は一体何でしょうか?
このような関数の書式ははじめて見ました。
UNIX系の何かでしょうか。
回答よろしくお願いします。

Aベストアンサー

typedef void (*sighandler_t)(int);
sighandler_t signal(int signum, sighandler_t sighandler);
より後半部分のtypedefを置き換えると
sighandler_t signal(int signum, void (*sighandler)(int));
つぎに戻り値の部分のtypedefを置き換えると
void (*signal(int signum, void (*sighandler)(int)))(int);
となります。
(
sighandler_t signal(int signum, void (*sighandler)(int));
の「signal(int signum, void (*sighandler)(int))」をAと置き換えて
sighandler_t A;
からtypedefを置き換えると
void (*A)(int);
となり、Aを戻すと
void (*signal(int signum, void (*sighandler)(int)))(int);
となる。
)

typedef void (*sighandler_t)(int);
sighandler_t signal(int signum, sighandler_t sighandler);
より後半部分のtypedefを置き換えると
sighandler_t signal(int signum, void (*sighandler)(int));
つぎに戻り値の部分のtypedefを置き換えると
void (*signal(int signum, void (*sighandler)(int)))(int);
となります。
(
sighandler_t signal(int signum, void (*sighandler)(int));
の「signal(int signum, void (*sighandler)(int))」をAと置き換えて
sighandler_t A;
からtypedefを置き換...続きを読む

QC言語でプログラミングできるソフト(初心者)

大学1年で今年から始めてプログラミング(C言語)を学ぶものです。
今のところif文やfor文、関数などの基本をかじった程度なのですが
なんとか自分の家のパソコンでプログラミングを行いたいので、
何か良いソフトのようなものはないでしょうか?(有料でも構いません)

実際に文などが書けて、コンパイルし、結果を出力してくれるものです。
パソコン自体がまだ初心者なので、できればで良いのですが、分りやすいものをお願いします<m(__)m>

Aベストアンサー

#4さんも書かれてますが、大学であればunixかLinuxの環境だと思います。
なので、私もcygwinをお勧めします。windows上にuinxの環境を構築できて、gccという無料のコンパイラが利用できます。
それにunixやlinuxの環境構築の良い勉強になります。

簡単な導入の仕方がありますので試してみてください。
http://www.twcu.ac.jp/~osada/comp2a/cygwin.html
こちらも参考に。
http://programnet.hp.infoseek.co.jp/coloum/colum.html

Qvoid (*signal(int signum, void (*handler)(int)))(int);

の解釈を教えてください
最後の「(int)」については詳しくお願いします

Aベストアンサー

signalが

(1)1つ目の引数の型:int
(2)2つ目の引数の型:引数がintで戻り値がvoidである関数へのポインタ
(3)戻り値の型:引数がintで戻り値がvoidである関数へのポインタ(2と同じ)

を満たす関数である事を宣言しています。最後の(int)はsignalの戻り値の
関数ポインタがint型の引数を持つ事を示しています。

「引数がintで戻り値がvoidである関数へのポインタ」の型をHANDLERと表すと

HANDLER signal(int signum, HANDLER handler);

となります。

Q初心者におススメのプログラミング言語は何ですか?

C C++ Java などの言語がありますが、中でも初心者(素人)が始めるにあたって一番おススメの言語は何ですか。

 教えてください。 よろしくお願いします。

Aベストアンサー

JavaScriptがオススメです。
理由は
1)ネット上に情報がたくさんある
2)開発環境の構築が容易
3)実行環境の構築が容易
4)実行時の動作がグラフィカルなので「達成感」がある
特に4は重要です。

必要に迫られない勉強は、やる気を継続させる事が結構難しかったりします。
コマンドプロンプト上で実行するような言語の場合、せっかく苦労してプログラムを組んでも
動作結果が地味な事が多いため、動いた事に対する感動が薄くなります。
これが積み重なると、途中で投げ出す結果につながりかねません。
その点、JavaScriptのようにダイアログを出したり色を変えたりといった
動作をさせる言語であれば、やる気の低下を抑える事が出来ます。

もっとダイナミックな動きをさせたいのであれば、
Delphi(Pascal)、C#、VBなどを使うのもいいでしょう。
どれも無料版の開発環境を配布しています。

将来プロになる事を考えているのであれば現在よく使われているPHPや
今後よく使われることになると思われるPython、Rubyなどを勉強するのもいいかもしれませんが
1つのプログラミング言語を身に付ければ他の言語に移るのは割と楽ですので
最初は勉強のしやすさを基準に選ばれると良いかと思います。

JavaScriptがオススメです。
理由は
1)ネット上に情報がたくさんある
2)開発環境の構築が容易
3)実行環境の構築が容易
4)実行時の動作がグラフィカルなので「達成感」がある
特に4は重要です。

必要に迫られない勉強は、やる気を継続させる事が結構難しかったりします。
コマンドプロンプト上で実行するような言語の場合、せっかく苦労してプログラムを組んでも
動作結果が地味な事が多いため、動いた事に対する感動が薄くなります。
これが積み重なると、途中で投げ出す結果につながりかね...続きを読む

Qmain()とint main(void)の違い

最初main()と習ったのですが、最近学校でmain()ではなくint main(void)を使うように
なりました。
どのように違うのでしょうか?
main関数のところに引数が入っている意味がわかりません。
(void)ってなんですか?
そもそも引数って何ですか?
あと、プログラムの最後にreturn(0)って書いてあるんですが、これはどういう意味ですか?
回答よろしくお願いします。

Aベストアンサー

C言語の歴史的な流れとして、だんだんと厳格になっています。最初は無かった規則が、後の規格で追加されています。
互換性のために古い書き方もある程度できますが、新しい記述方法が推奨されます。

話がmain関数だとちょっとわかりずらいところもあるので、いったん、自分で関数fooを定義するときのことを考えます
○引数
引数は関数を呼び出すときに()の中に指定するもので、呼び出し側と関数とのデータのやりとりに使用します。
例えば、 atofなら atof(s1)として文字列s1を関数に渡します。aotf関数では、渡されたs1から数値に変換して戻り値として返します。
これを、atof(s2)とかatof("3.14")とか引数を変えることで、戻ってくる値も変わります。

○ return
関数から戻り値として値を返すときにreturn を使います。
通常はretrun で値を返す必要があります。
戻り値が無いことを示す void型の関数の場合は逆にreturn X ;と値を返してはいけません。return;とだけ書きます。

○ foo()
これは、関数定義の際に
・戻り値の型が省略されたときはint型とみなす
・引数に何も記述が無いのは、「可変引数」だとみなす(要するに、いろんな型の引数を何個並べてもいい)
というルールが適用されます。これは、古いCがそのように動作していたからです。
現在ではこのような省略は推奨されていません。現行のルールで省略無しに書くと
int foo(...)
となります。

○ int foo(void)
可変引数だと、引数の型も数も任意になるので
foo(a), foo(0.5,8), foo("BAR",3),foo(3,"BAR")
いずれも「問題無い」としてコンパイルできてしまいます。普通に考えて、foo("BAR",3),foo(3,"BAR")が両方動作する状況は少なく、どちらかが間違いなはずです。
そこで、現在では、引数の型と数をちゃんと宣言するようにし、可変引数は、最小限の本当に必要なところだけにします。

何も引数が無い場合(foo()と使用する)、 foo()と宣言したら上の暗黙のルールが適用されてしまいます。そこで、「何も無い」ことを明示するために、 (void)と宣言します。

○ int main(void)
main関数も関数の一つなので、上のルールが適用されます。
ただ、特殊な扱いをされる関数なので、なんでもかんでも使えると、システムとして問題にあります。
そのため、戻り値と引数には一定の決まりがあります。
・戻り値はint
・引数は (void)または(int, **char)
・それ以外は環境依存。組込み用等の特殊用途では、上のルールを使わないで、専用の型と引数になることもある。

○main関数の引数
最初のころの演習問題だけだと、意識することは無いでしょうが
例えば、入力ファイル名を変えるとき、演習ではソースを変更→コンパイルとしていると思います。

しかし、実際の場面では、そんなことはしていません。
a.txtを表示するなら
cat a.txt (WINDOWS なら type a.txt)
b.txtを表示するなら
cat b.txt (WINDOWS なら type b.txt)
と、コンパイル無しでできます。
これらのa.txt,b.txtのような指定を「コマンドライン引数」あるいは、他と区別付くなら単に「引数」と呼びますが、これをプログラムから受け取るための仕組みがint main(int, char**)と宣言されたmain関数の引数になります。
詳しくは、参考書、入門サイト等を見てください。

○main関数の戻り値
これも演習問題では意識することは無いでしょうが

まず、int型として宣言した以上は、なにか値を返す必要があります。そのためにreturn 0;のように明示する必要がありす。

バッチファイルやシェルスクリプトを使っていると、コマンドが成功したかどうかで処理を分けたいことがあります。
このとき使用するのが、例えばWINDOWSだったらERRORLEVELなのですが、これに設定されるのが、main関数の戻り値です。

通常、正常終了では0,エラー等があった場合は0以外を返すようにします。

returnを省いても、main関数の最後まで来ればプログラムは終了しますが、そのときには何が返るかわかりません。0でないことが多いでしょう。となると、正常に終了したはずなのに「異常終了」とみなされてしまうことになります。

C言語の歴史的な流れとして、だんだんと厳格になっています。最初は無かった規則が、後の規格で追加されています。
互換性のために古い書き方もある程度できますが、新しい記述方法が推奨されます。

話がmain関数だとちょっとわかりずらいところもあるので、いったん、自分で関数fooを定義するときのことを考えます
○引数
引数は関数を呼び出すときに()の中に指定するもので、呼び出し側と関数とのデータのやりとりに使用します。
例えば、 atofなら atof(s1)として文字列s1を関数に渡します。aotf関数では、渡さ...続きを読む


人気Q&Aランキング

おすすめ情報