Microsoft Visual C++は、プログラミング教育の癌 (2)

続、独断と偏見に満ちたアンチC++オヤジの妄言です

内容は、ただでさえ挫折しがちなプログラミング学習の現場に、時代遅れで複雑怪奇なVisual Studio と C++が大きな顔をしている、実にけしからんというお話です。

有害無益なC++の入出力データストリーム

C++入門というキーワードで検索すると、多くのサイトでcout, cinを使った例が最初に紹介されています。

(例)C++入門 – asahi-net.or.jp から

C++入門2   coutを使った出力
C++入門3   cinを使った入力
C++入門4   オブジェクト指向について
C++入門5   クラスを作ろう

学生がこれを使ったプログラムを書いて(コピペ?)行き詰っているのにつきあっていて、このcin, coutという書き方は有害無益だと思うようになりました。

cinに誤った文字列を与えると黙って処理をさぼるようになる

cinに誤ったパラメータを読ませると黙り込んで処理を流すするようになります。
学生が次のようなプログラムを書いて「処理がうまく行きません。」と質問してきました。

double xa, ya;
while (true)
{
  // データ受信
  ...
  // データ送信
  cout << "input xa ya:" << endl;
  cin >> xa
  cin >> ya;
  // xa, ya に入れたデータを送信
  ...
}

具体的には一回目は入力待ちで止まるが、次から無限ループになるという症状です。

C++に拒否反応があり知識がない私でも、デバッガで確認すればcinが反応しなくなっていることがわかり、Webで調べれば解決策もすぐ見つかるので、C++のエキスパートにとっては「なんだ、そんなこともわからないのか。」という感覚なのでしょうが、デバッグの仕方もよくわからない初心者に取ってエラーで黙りこんでしまう言語仕様は最悪です。

 変数xの型にかかわらず cin >>  x でコンソール入力した文字列の値をxに読み込めるということは、裏で値に応じた変換がおこなわれているということで、うまく働いているときは便利な書き方に見えます。

しかし上の例のようにcinを使って2つの変数にどのように値を読み込むかがわからず、変数の型もよく分かっていない初心者に cin がプログラムの基本的な書き方ですよと教えるのは間違いだと思うのです。

cin, coutはC++を格好よくみせるためだけのものではないのか?

cin はコンソール入力用の記述ですから、コマンドラインアプリケーションを書くために使うことになります。
しかし、Windowsで新しいコマンドラインアプリケーションを書くことなど殆どなく、簡単なプログラムでもウィンドウが開くGUIアプリケーションになります。

コマンドラインアプリケーションを書くとしたら入力文字列にエラーがあるときはそれに対応した処理をするのが必須であることを考えても cin など誰かが思い付きで作って実用的なアプリケーションでは使われない言語仕様が未だに初心者向け文法として大きな顔をしているだけのように思えてなりません。

実際のところ、cin cout が無いと効率的にコンソールアプリを書くことが出来ないと思って使っているベテランプログラマがいるのでしょうか。