「私は現在、職業訓練校にて勉強し始めた初心者です。」の回答への反論

アクセス解析を見ると、教えて!gooの「私は現在、職業訓練校にて勉強し始めた初心者です。」という質問の回答から当サイトへのリンクが貼られたようです。それ自体は何の問題もありませんが、回答が間違っているようです。間違った回答を補強してしまうとすれば、当サイトにも若干の責任がありますので、ここで反論しておきます。

C言語の厳密な仕様・規格等については詳しくありませんが、#1さんが
書かれているとおり、
  signed も unsigned も付けずに単に、char型として宣言した場合、
  符号付き(signed)となるか、符合無し(unsigned)となるかは、
  言語仕様としては【未定義】であり、
  その扱いは、処理系依存(コンパイラにより定義が異なる)
となるようです。(※下記参考サイト参照)

回答では上記のように記されています。字下げの部分はあたかも引用したように見えますが、当サイトも、もうひとつリンクを貼られたサイトにもこのような記述はなく、#1の回答にもこうした記述はありません。

「等値」と「等価」

「プログラマーの力量を見極める--面接官になったら尋ねるべき質問実例集」が話題になっているようです。そのうちの、

  • 「等値」と「等価」の違いを説明してください(この質問はTechRepublicのTony Patton氏に教えてもらったものである)。

については、私も気になってので少し反応しておきます。

まず、国語的には、「等値」は「値が等しいこと」であり、「等価」は「価値や価格が等しいこと」ですが、実際のところそれほど厳密な区別はありません。もちろん、特定分野において、それぞれに明確な定義を行った場合は別です。ここではそれを正確に把握できるほどの情報がありませんので、何ともいえません。

2級にも挑戦しようとしたけれど...

前回に引き続き、2級にも挑戦してみようと考えました。3級は問1しかやっていないじゃないかといわれるかもしれませんが、細かいことは気にしないでください。例によって2級のサンプル問題を覗いてみました。

ざっと見た感じでは、問1は3級より簡単そうです。ソースコードの穴埋め問題もそれなりの数があるのですが、穴埋めだけでは特定の処理系を過程しないと、とても動きそうにありません。問題点は移植性だけではなく、明らかな不具合も含まれています。全部消して新規に作りなおすのであれば、まだ何とかなりそうな気もしますが、穴埋めだけではまともなプログラムにできそうにありません。

例えば、問7の四文字熟語の問題では、四文字熟語のうちの1文字を伏字にして、その文字が何かを当てさせる簡単なクイズを作る問題です。ところが、問題作成用の四文字熟語のテーブルには、どういうわけか「絶対絶命」という言葉があったりします。これをもとに「絶?絶命」と出題して、「体」と答えると結果は×になるというのです。そんな動作は到底納得のいくものではありません。

C言語検定難しすぎ

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

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

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

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

未整理エントリー

ここには、「C++ろ組込み環境」に収録を検討しているけれども、まだ整理されていない記事を集めることにします。必然的に乱雑なものになりますし、内容の正確さについても十分な検証がなされていない可能性が高いと考えてください。

_Static_assertのまねごと

危ないRiSKのブログ うつ期ver.「_Static_assert とは」という記事に触発され、私も_Static_assertのまねごとをやってみたくなりました。

まず、第二引数のメッセージ文字列を反映することは無理なので、エラーの検出を行う部分の真似だけにとどめることにします。C++のstatic_assertのまねごとは比較的簡単にカタがつくのですが、C99の場合には意外な問題が見えてきました。ひとつは、条件式が定数式でない場合にエラーにできるようにすること、もうひとつは構造体定義の中など、C1Xの本来の_Static_assertが使える文脈で使えるようにすることです。

C1XのBounds-checking interfacesの実装に挑戦したい...

まずは、C1XのBounds-checking interfaces が何なのかから説明します。簡単にいってしまえば、メモリへの不正アクセスをチェックできるようにしたライブラリ関数群のことです。大雑把にいえば、Visual C++ 2005 以降で登場した _s 付の関数の標準版のようなものです。

実は以前にも実装に挑戦したことがあるのですが、Visual C++.net 2003 への対応が難しかったので、そこで挫折してしまいました。というのも、Visual C++ 2005 以降であれば、ストリームの排他制御に用いる _lock_file 関数がユーザーに公開されているのですが、2003以前のバージョンでは非公開だからです。静的リンクの場合は強引に使ってしまうこともできるのですが、ランタイムライブラリをDLLにしたい場合はどうしようもありません(同じものを再実装するという手はありますが...)。

私の場合、Visual C++.net 2003 はまだまだ現役です。というのも、2005 以降だとデバッグモードが遅すぎて使えないことも多々あるからです。いろいろなチェックをやめればある程度は改善されるのでしょうが、IDEがそもそも重いので、2003で済む場合は2003を使いたいのです。

実は <inttypes.h> も公開しているのですが...

かなり前に公開したVisual C+用の <stdint.h> が、いまだにいろいろなところで使われているようです。そもそもVisual C++がサービスパックを出してもバージョンアップしても、一向にC99に対応する気配がないことに問題があるのですが...。

それはそうと、実をいうともう1年半近くも前に、Visual C++用の <inttypes.h> も作って公開していたりします。
http://file.dradnats.org/inttypes-20081030.zip
ちゃんとテストしていないので、ベクターにも登録していなかったのが原因なのか、あるいはまったく必要とされていないのか、どうも使われている形跡がありません。多少なりとも反響があれば、もう少しまともなものに仕上げてもよいかと考えています。

C++を使う場合でも、printf系関数の書式指定の便利さはなかなか捨てられないもので、ostringstream より sprintf や snprintf が多用される傾向にあるように思います。それなら <inttypes.h> も必要になるような気もするのですが。

C言語ってきもい?

たまには他所さまのプログラミング記事についても言及してみることにしましょう。今回取り上げるのは、ブログ「赤の他人」「C言語ってきもい」です。ここでは、下記のようなコードがあったとき、b() == c() が真にならない可能性はあるか? という問題を扱っています。

コンテンツ配信
このエントリーを含むはてなブックマーク