C言語検定難しすぎ

どうやらC言語検定の結果が発表されたようです。いまさらながら、どんな問題なのか見てみようと思い、サンプル問題に取り組んでみることにしました。最初なので一番レベルが低いとされる3級からの挑戦です。

挑戦した感想ですが、「これが3級?」というぐらい難しい問題でした。それでは順番に見ていくことにしましょう。まずは、問1からです。

問1 C言語の特徴に関する次の記述の正誤を,解答群の中から選べ。

解答群というのは、「正しい」と「誤り」の二つです。マークセンス方式なのでこのようになっています。

(1)全角の空白と半角の空白は,ともに空白文字として扱われる。すなわち,全角の
 空白は半角の空白2 文字分として処理される。

いきなり超難問です。この検定では処理系を特定していませんので、特定処理系がどうであるかについての解答は要求されていないはずです。Cの規格では、全角か半角かなどの規定はなく、どちらも空白文字として扱ってもよいですし、一方だけを空白文字として扱ってもよいはずです。全角の空白が半角の空白2文字分として処理されるという下りも、どんな状況での話なのかがよくわかりません。ソース文字集合が全角の空白であっても、実行文字集合が半角の空白2文字分になるということがあっても、それはそれでよいでしょう。ただ、常にそうかというと、決してそんなことはないので、ここは「誤り」ということにしましょう。

(2)C言語は,コンパイルが不要であるインタプリタ言語である。

例えばCINTのようにインタプリタの処理系もあるわけですが、Cが常にインタプリタとして実装されるかというとそうではないので、ここも「誤り」としましょう。どうやら、常に成り立つかどうかが判断基準のようです。

(3)C言語では一つのコマンド記述が複数行にまたがる場合,必ず行末に'¥'を記述
 しなければならない。

まず「コマンド記述」というのが何なのか、私には理解できませんでした。あと、'¥'とのことですが、それは最低限サポートしなければならない基本ソース文字集合には含まれない文字です。したがって、常に成り立つわけではないので「誤り」としましょう。

(4)C言語では,変数名がABC とabc のように大文字と小文字の違いだけなら,同じ
 変数として識別される。

これまた難問です。Cでは、外部結合の識別子に関しては、大文字小文字が区別されるかどうかは処理系定義です。しかし、常に成り立つかどうかの観点からすれば、これまた「誤り」です。

(5)C言語では,記号定数EOF の値はstdio.h の中において-1 で定義されている。

これは簡単です。EOFは、int型かつ負の値を持つ整数定数式に展開されることが規定されているだけですので「誤り」です。

(6)C言語では,変数名に予約語を使ってはいけないが,予約語を含む名前は使って
 よい。

これは厳しい引掛け問題です。ついつい「正しい」としてしまいがちです。ところが、予約語 _Complexを含む_Complex1_2iのような名前を使ってよいかというと、これは予約済み識別子なので使うことはできません。よって常に成り立つわけではないのでこれも「誤り」です。

(7)C言語は,宣言した配列の要素数を越えた添字で配列要素を参照した場合,コン
 パイルエラーが発生する。

これも微妙な問題です。配列の要素数を越えた添字で配列要素を参照した場合は未定義の動作ですので、静的に検出できるのであればコンパイルエラーになってもかまわないわけですが、やはり常に成り立つわけではありません。よって「誤り」です。

(8)C言語では,多次元配列を使用することができるが,最高5 次元配列までである。

これは簡単ですね。Cでは多次元配列を使用することはできないので「誤り」です。これで問1は終りです。

とりあえず問1だけ答え合わせをしてみることにしました。私の解答は(1)から(8)まですべて「誤り」ですので、答え合わせも簡単です。巻末の正答を見てみると、何と!「正しい」が3つもあるではないですか。正答率62.5%です。これはかなり厳しい結果が出ました。ヘタをすると、3級に合格できないかもしれないと、そんな予感がしてきました。うむむ、C言語検定難しすぎます。

この記事のトラックバックURL:

http://www.kijineko.co.jp/trackback/716

_

これはあまり深いところを考えなくて良い問題ではないでしょうか。
検定自体はC言語特化型ということでこういうのはあって良いと思います。
私は2級まで持っています。

コメントありがとうございます。

> これはあまり深いところを考えなくて良い問題ではないでしょうか。

あまり深いところを考えないというと、各受験者が、日ごろ自分が使っている処理系を前提に解答すればよいという意味でしょうか?
だとすると、出題者が想定している処理系とたまたま同じ、または類似点が多ければ合格し、そうでなければ不合格になるという、極めて不公平な状況になってしまいます。

> 検定自体はC言語特化型ということでこういうのはあって良いと思います。

もちろん、C言語特化であって、特定のコンパイラベンダー特化であってはならないと思います。

返信有難う御座います。 この問題で良いという

返信有難う御座います。
この問題で良いという趣旨ではありません。(分かりにくくてすいません。

例えば、インタプリタの処理系もあるとは私は始めて聞きました。
しかし多くはC言語はコンパイルとリンクが必須と解釈されているでしょう。
自分の処理系というか、おそらく多くの人向け、一般的な処理系を想定して考えれば良いのかも知れません。

そう考えるとやはり「これは悪問ではないか」という事になってしまいますね。
やはり高木さんの方が問題作成者よりC言語に詳しすぎるのでしょうか。

一般的な処理系?

> おそらく多くの人向け、一般的な処理系を想定して考えれば良いのかも知れません。

それはかなり難しい話ですよ。

「多くの人」ということであれば、現在、C言語で開発しているのは、組込み系のエンジニアが最も多いはずです。
だとすると、複数の処理系を使いわけることは普通ですし、その種類も多岐にわたります。

また、「一般的な処理系」というと、それは、特殊な存在である露骨な非標準処理系ではない処理系ということになります。
特に断りがなければ、現行規格であるC99を想定する必要もあるでしょう。

C99は普及していないという人も多いのですが、使っているかどうかはともかく、C99対応の処理系は割と普通にあります。
完全に規格準拠かというと何ともいえないところですが、それをいうならC90でも五十歩百歩でしょう。

なるほど。そうなんですか。 ありがとうござい

なるほど。そうなんですか。
ありがとうございます。
C言語の世界は広いですね・・。

多次元配列の次元数

間違ったまま放置するのも何ですので、多次元配列は何次元まで可能かを調べてみました。
翻訳限界がこれに相当するわけで、5.2.4.1 Translation limitsによると

— 12 pointer, array, and function declarators (in any combinations) modifying an
arithmetic, structure, union, or incomplete type in a declaration

ですから、確実に保証されるのは12次元までのようです。C90でもC99でも同じです。

>

> Cでは多次元配列を使用することはできない

これは違うのではないでしょうか。

多次元配列という用語はCの規格でも使われており、
規格の6.7.5.2の脚注によれば、Cでは配列の配列と多次元配列は同義ではないでしょうか。

コメントありがとうございます。

ご指摘のとおりです。
調べずに解答すれば、私の実力は3級に満たないということで...

このエントリーを含むはてなブックマーク