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

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

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

C言語の表現の基本構造は「関数」ではあるのだが、その中には「予約語」というのがあって、これは「使ってはいけない関数名」ということになる。

「その中」の「その」って何を指しているんだろう? 「関数」を指しているように見えるけど,だとしたら大間違い。

つまり、同じ「if」という名前で関数を作られてしまうと、システムでは条件分岐のための「if」なのだか、あるいは関数の「if」なのだか、構造が同じなので、わからなくなってしまう、というわけだ。

構造が同じ? 識別子あるいはトークンが同じの間違いです。

そこで、条件分岐を表現する「if」、ループを表現する「for」などは、関数名として使えない。これらの「使えない関数名」は、「予約語」と呼ばれていて、これもシステムで定義されている。予約語は約20個くらいあるので、C言語の教科書などでちょっと見ておくとよいだろう。

また出てきた。謎用語「システム」。「構文解析する(コンパイル段階の?)システム」と「予約語が定義されている(規格としての?)システム」があるらしい。はっきり分けましょう。
予約語については非常に不正確。「hogeくらい」という非常に曖昧な表現を使うくらいなら,C言語の教科書などをじっくり見ておくとよいだろう。実際のところ予約語(正確には「予約済み識別子」)は非常に多くあります。その内の「キーワード」でしたら37個あります。…まぁ,「約20個くらい」でしょうかね(苦笑…)。

また、関数の定義は、

このforとかifとかの構文や、main関数の書き方を見る通り、

int function(parameter) { procedure }

となっていることがわかるだろう。

何で関数の定義の説明で for や if の構文が必要なんだ? もしかして for や if を関数だと思っているのだろうか?

そして、この定義された関数を使う側では、

x = function(parameter) ;

で呼び出す。このうち最後の「;」は、「1つの呼び出しなどの機能の区切り」という意味だ。

セミコロンの説明は間違い。私が高二か高三の頃と同じ勘違い。

関数を定義する側では、もしも必要なくても、必ず「戻り値」とか「変数」を定義したほうが良い。その定義に従って、コンパイラは、他のプログラムでその関数を呼ぶときに、関数を呼ぶときの形式があっているかどうか、調べてくれるからだ。

定義と宣言の区別がついているのだろうか?
宣言は必ず必要です。省略が(規格で)許される時代は終わりました。

もちろん、どちらもなにもないときは「void(型なし)」を指定すると良い。

voidは型無しを表すのではありません。「void型」という,れっきとした型です。

たとえば、関数を呼び出すだけで、変数もないし、戻り値もない、という関数を定義するときは、

void function(void)
{
(プログラム記述)
}

というように定義しておくと、ほかのプログラムでこの関数を呼ぶときに、

h = function(x) ;

と書いてあると「それはおかしいよ!」と、コンパイラが教えてくれる。バグとりにも、かなり有効だ。

「ほかのプログラム」が何を指すのか不明。function関数をどのように定義しようが,呼ぶ側で宣言が見えなければコンパイラが正確な型を教えてくれることはありません。だって正確な型が分からないから,それを教えられないですもの。


(続く)