【C言語】三項演算子は悪者なのか?

 C言語で条件に応じた代入をするときはif文を普通に使っていると思います。ただ、テキストなどには「三項演算子」という方法も書かれていると思います。

三項演算子を使うとコードは非常にスッキリとします。しかし、if文と比べると何をやっているのか良くわからないという問題、つまり可読性の問題があります。


じゃー三項演算子は封印?

それでもいいんじゃないですか?と言っても良いかもです。とにかく可読性のことを考えるとif文が分かりやすいわけだから。

しかし、if文って長いです。elseを使って場合によって2つの値を入れる場合は

  1.     if(z<0){a=msgNeg;} else {a=msgPos;}

となります。さらに場所を節約するために一行にしているので、可読性は下がっていると考えます。であれば、同じ表現を

  1. b=z<0?msgNeg:msgPos;

のように三項演算子で書けば良いのでは無いでしょうか?そして、何をやっているかコメントで残しておけば十分理解できると考えます。

簡単な結果だけに適用する

冷静に考えると、三項演算子で見にくい場所は、判断結果の収納場所です。判断を書く場所はif文のカッコの中と同じです。

なので、結果によって単純な定数を代入する程度の処理だけに使って下さい。もちろん、三項演算子を使ってこのような処理をしています。というコメントは必須です。

以下はIF分と三項演算子を使った比較サンプルです。

  1. #include<stdio.h>
  2. const char *msgNeg = "負の値";
  3. const char *msgPos = "正の値";
  4. main(){
  5.     int z;
  6.     const char *a,*b;
  7.     
  8.     printf("z=?");
  9.     scanf("%d",&z);
  10.     
  11.     //zが正か負の値かでメッセージを表示する。
  12.     
  13.     //zが正か負かでメッセージを変更する。bにメッセージの文字列先頭が入る。
  14.     if(z<0){a=msgNeg;} else {a=msgPos;}
  15.     //三項演算子を使った方法。コードはスッキリするが初見ではわかりにくい
  16.     b=z<0?msgNeg:msgPos; //zが正か負かでメッセージを変更する。bにメッセージの文字列先頭が入る。 三項演算子を使用。
  17.     
  18.     printf("a=%s\nb=%s\n",a,b);
  19.     
  20. }

このような単純な処理であれば、しっかりとコメントをした上で三項演算子を使いコードのスペースを削減するのが良いと考えます。

馴染みのない複雑なアルゴリズムを記述する場合は、丁寧にIF分を使うことをおすすめしますが、単純で誰でも分かるロジックであればコード単体での可読性より、文字の少なさを優先したほうが良いと考えます。

そして、簡単なコードがコンパクトになることにより、より高水準のやりたいことに集中出来ると考えます。

AmazonでC言語の本を調べる


ウィンドウズアプリ入門 クリップボードにコピーされたらメッセージを受信する方法

 Windowsアプリでコピーされたときにイベントを取得できると便利です。例えばコピーされた内容を画面に表示したい場合などです。 もちろんタイマーイベントで定期的にポーリングをする方法もありますが、やや無駄な処理かもしれません。 Windowsとしてはコピーされたときのイベントを...