3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

C言語で三項演算子の偽の値を省略(?)する

Posted at

「可読性なんかどうでもいい!何が何でも三項演算子を使わせてくれ!」
「if文なんてもう書きたくない!」
という全国1億3000万人の三項演算子ファンの皆さま、お待たせいたしました。

例えば、

if(flag == 1) {
  result = NUM;
}

というようなコードは三項演算子にはせず(する必要もないですので)、1行で済ませたい場合も以下のように記述するのが普通かと思います。

if(flag == 1) result = NUM;

たしかに可読性も悪くならずにそれなりにスマートにはなっていると思いますが、三項演算子ファンの皆さまにはifが邪魔くさく感じられていると思います。
三項演算子は真と偽の結果を用意するのが通例ですが、特に入れるものが無い場合には数値を入れてしまいましょう。

(flag == 1) ? result = NUM : 0;

ifを使った場合より長いとか可読性が微妙とかは置いておいて、少なくとも自分の環境では期待通りの動作が行えています。
タイトルには「偽の値を省略」と書きましたが真の値に入れることも可能です。

(flag == 0) ? 1 : result = NUM;

C++や#defineなどでTRUE、FALSEが使える場合は置き換えると可読性も上がりますね。

(flag == 1) ? result = NUM : FALSE;

実行時間比較

このままだとクソpostなので、時間計測をすることによりそれっぽい体裁を保ちます。
環境はCentOS 6.7(x86_64) + gcc4.4.7です。
以下のコードを実行してtimeコマンドで計測しました。

test1.c
int main() {
  int result, i;
  for(i = 0; i < 2000000000; i ++) {
    if(i % 5 == 0) result = i;
  }
  return 1;
}
test2.c
int main() {
  int result, i;
  for(i = 0; i < 2000000000; i ++) {
    (i % 5 == 0) ? result = i : 0;
  }
  return 1;
}

結果

timeコマンドにおけるユーザ時間の10回分の平均です。

if文 | 三項演算子

:------:|:---------:
4.379s | 4.379s

なんと20億回のループで平均時間が同じという結果でした。
これで三項演算子ファンの皆さまも大手を振って記述できますね。

実際GPU上とかだとワープダイバージェンスの関係で結果が変わるかもしれないですが、計測してないのでわかりません。
おしまい。

3
1
6

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?