とくにあぶなくないRiSKのブログ

危ないRiSKのブログだったかもしれない。本当はRiSKだけどググラビリティとか取得できるIDの都合でsscriskも使ったり。

『三田典玄の「体育館の裏話」 - 関数の話(2)』につっこむ

数学の記述では、

y = f(x)

と記述してから、「f」を定義する。

C言語でもそれは同じだけれども、あくまでプログラミング言語であるために、順序から言うと「f」の定義をしないと「f」が存在しない、ということになるから、まず「fの定義」をしてから、「f」を利用するために呼び出す、という順序でプログラミングが進行する。コンパイラやリンカもほとんどこの順序で「関数」を認識し、使う。

C言語でもそれは同じだけれども,」以下,同じではない説明が続いており意味不明。
また,関数定義→関数呼出しの順でプログラミングをするパターンだけでなく,
関数宣言→関数呼び出し(→関数定義)の順でプログラミングするパターンもある。

一番簡単でよく知られている言語プログラムは、やっぱりこれが代表かな?

main()
{
printf("Hello World !\n");
}

これが「一番簡単でよく知られているプログラム」だとすると,C言語の将来オワタ\(^o^)/ です... 世間様の認識ってこの程度なのでしょうか... 少なくとも K&R ぐらいは読んで欲しいです...

このプログラムでは「main()」という関数が「定義」されている。

違います。「main」という識別子(いわゆる名前)の関数が「定義」されています。関数を定義する上で () が現れますが,() は関数を表す識別子の一部ではありません。ってか,()付いてる箇所と付いてない箇所がある...

mainプログラムの中では、ここではまったく事前に定義もなにもされていないのに「printf」という名前の関数が使われている。でも、printf はほかのところですでに定義されているから、ここでは「printf」という関数がどんな関数であるかは、このプログラム中に記述する必要がない。「定義 は省略可」なのだ。しかし、これはあらかじめきめられた「標準ライブラリ」などの中で定義された関数でなければならない。

冒頭の段落と矛盾した記述。もはや,どうつっこめばいいのか分からない。でも,がんばってみる。
「全く事前に定義もなにもされていない」の後に「ほかのところですでに定義されている」ってどういう事じゃ? ほかのところで事前に定義されていると言いたいのだろうか?
『「定義 は省略化」なのだ。』って,おいっ,どっちだよ。
『しかし、これはあらかじめきめられた「標準ライブラリ」などの中で定義された関数でなければならない。』って…。結局,定義が必要なのね…。
定義は省略化/必要うんぬん言ってないで,定義される場所について書けばいいんじゃないの? わけわからん。

ところで、(2)でも書いたように、

単純なタイポ。(1)ですね。

この小さなプログラムで定義されたり使われている「main」や「printf」といった「関数」では、その「戻り 値」が、「=」で結ばれて、その左側にある「変数」に代入される、というようには書かれていない。

ここで,関数の定義と関数呼出しを一緒にしちゃまずい。

main関数はそれが定義されて呼ばれるために書かれているわけだけれども、その戻り値についてはなにも書かれていない。なにも書かれていなくて、省略さ れているとその戻り値は「int」型のデータである、ということになっている。つまり、main()関数はint型のデータ型を持つ、ということになる。

「なっている」は間違い。正しくは「なっていた」。
型の省略は許されていません。今は2007年です。古くて間違った情報を書かないで。

もちろん、mainを呼ぶ側のシステムでは、main関数の戻り値を見ている。これはシステムで決められている。

直接C言語と関係なさそうですけど,つっこみます。
初めの「システム」は処理系の事でしょうか。
次の「システム」は規格の事でしょうか。
解釈が難しすぎます…。

もちろん、システムからmainを呼び出すときの「( )」内に書かれる「変数」も決められている。

(^□^;)日本語でおk

これらはANSI(American National Standards Institute)という規格にすべて書いてある。

間違いです。書いてあるのでしたら,引用が欲しいです。引用があれば言いたいことが分かります。
ってか,ANSIは古すぎます。今はISO/IEC9899:1999あるいはJIS X3010:2003が標準規格です。今は2007年であることをお忘れなく。

また、printfの戻り値も省略されているから、これは「int型の戻り値を持つのだな」ということで、プログラムが書かれている。

えーーーーーーーーーーーーーーーーっ!
関数呼出しの結果を無視したからといって,printfの型がintになるわけではないです。
関数定義において,型を省略するとint型と見なされる時代があっただけです。
呼出しと定義は別です。
…ってか,printfの戻り値どころか定義も宣言も省略されてるじゃねーか,と自分につっこんじゃった。この場合も,「戻り値の型がintと見なされる時代があった」という説明で十分です。

C言語では、この「無視」「省略」「あらかじめ定義」などがいくつかある。そのようなものを覚えると、C言語プログラムはより簡単になる。

いやいや。その前に現代のC言語を覚えましょう。


(続く)

追記

ときどきの雑記帖 リターンズ 2007年11月(中旬)

ネタ半分くらいに受け取った方が精神衛生上よろしいかと思います。

ご心配ありがとうございます。
えと,楽しみつつ書いていますので大丈夫です。自分の復習でやっていますので。実は,某氏の本を持っていたりするので,知らずにイバラに突っ込んでいるわけではありません。
RiSKの本棚 - 入門C言語