Previous ToC Next

134. C言語の進化 (2016/12/27)

今回あまり HPC ネタではありません。

新規開発で C でやる、ということもあまりなくなっているかもしれませんが、 C++ には何かをするための方法があまりに沢山あり、 STL も便利ですが記述 が極めて煩雑(C++11 で auto が導入されて改善はされてますがではそれまで はなんだったんだみたいな)であるとかそういうわけで結構言語仕様がどんど ん大きく変わるとか色々あって、長期にわたって継続的に(というか数年毎に ちょっとづつ)いじるような開発にはあんまりどうかなというところがありま す。

というわけで某プロジェクトのコードを十数年前に C++ ではなくて C で書い たものをいまだに使い回しているわけですが、Cも昔に比べると随分便利になっ てます。

要するに、使うとイライラしたところが随分ましになってます。

以下ちょっと技巧的かもしれませんが、例を。 速度はあまり問題ではないんだけど、ちょっと複雑なフラグによる処理をした い、という状況、具体的な例としては、 flag が 0,1,2,3 の値を取り、それによって 変数 x に式 a, b, c, d のどれかをセットしたい、という状況を考えます。 ruby なら

   x= [a,b,c,d][flag];
と書くところです。昔の C だと、switch 文を使って

  switch(flag){
      case 0: x=a; break;
      case 1: x=b; break;
      case 2: x=c; break;
      case 3: x=d; break;
  }
と書いたところでしょう。 break をいれるのを忘れるとか default (ここで は使ってませんが)のスペルを間違えるとかで色々な楽しいことが起こります し記述量も多くなってます。これが、今どきの C だと (x 等が double だと して)以下のように書けるようです。

  double cases[]={a,b,c,d};
  x = cases[flag];
ruby のように1行とはいきませんが、switch を使うのに比べるとはるかにま しです。もちろん、性能的には色々問題があります。 a, b, c, d がそれぞれ 複雑な式とか関数であってもどちらも同じように動きますが、 switch は成り たったところで break で switch 文が終わりますが、配列を作るとまず全部 の要素が評価されます。まあでも、性能が問題にならないところであれば使っ てもいいのではないでしょうか?
Previous ToC Next