「簡単で難しい“正確なC言語”」を読んで
ITProの記事「簡単で難しい“正確なC言語”」を読みました。その中に「標準Cトリビア3題」というちょっとしたクイズがあったので挑戦してみたのですが、期待されている回答ができたとはとてもいえない状況でした。まずは問題を引用します。
Q1:main関数の型はintである。
Q2:int型は少なくとも-3万2768〜3万2767を扱えなければならない。
Q3:\0はナル文字と定義されている。
まずはQ1からです。私の見解はこうです。main関数は、int main(void)、int main(int argc, char *argv[]),、これら2つと等価な方法、または処理系定義の方法で定義されるわけですが、いずれにせよ「関数型」であり、「オブジェクト型」である int ではありません。よって×です。
次にQ2ですが、ITProの記事に書かれている内容に加えて、2の補数表現であっても、符号ビットが1で値ビットがすべて0の場合には、それが「トラップ表現」であるか通常の値であるかは処理系定義です。したがって、これも×です。
そしてQ3です。まず、\0が何であるかですが、これはC言語における文字ではありませんね。文字定数と文字は同じではありませんが、ナル文字かどうかを問うのであれば、文字定数または文字列リテラル中の1文字として表現するしかないはずです。したがって、これも×です。
こう考えてみると、やはりC言語は"簡単で難しい"のかもしれません。
この記事のトラックバックURL:
http://www.kijineko.co.jp/trackback/651

_
こんにちは、いつも勉強させてもらっています。
僕は
Q1、○
Q2、×
Q3、×
と思いました。
>Q1:main関数の型はintである。
関数の型、ってことは関数の戻り値の型、ということですよね。
処理系定義が関数型、ということはいづれにせよvoidで定義するということだと読み取りました。
僕は前橋和弥氏の「C言語ポインタ完全制覇」のコラムをよんでCのmainはintだ!とすごく印象に残っていたので、1は自信をもって○にしました。
(p38ページのコラム「int main(void)について」)
まぁ一専門学生だとmainの定義が変わる処理系で作業する可能性はほぼ0なんでしょうけど。
では、失礼します。
コメントありがとうございます。
> 関数の型、ってことは関数の戻り値の型、ということですよね。
違います。
例えば、int main(void)として定義されたmain関数の型はint(void)型になります。
int main(int argc, char *argv[])として定義されたmain関数の型はint(int, char*[])型になります。
void main(void)であれば、void(void)型になります。
いずれにせよ、これらは関数型です。関数の型は、返却値の型だけでなく、仮引数の型や個数の情報もあわせ持った型になるのです。
ご指摘ありがとうございます。 なるほど・・・
ご指摘ありがとうございます。
なるほど・・・
つまりQ1の「関数をint型だ」というのはありえない表現だ、ということですよね。
ITプロの記事を読んだら、
>(mainはintだというのは)たいていはそれで正しい
と表現されていたので、関数の型が返却値だと思ってしまいました。
確かにint(void)型、と表現していただいた方が”関数の型”としてはしっくりきますね。