ユーニックス総合研究所

  • home
  • archives
  • c-enzanshi-hatena

C言語のはてな(?)を使った三項演算子の書き方

  • 作成日: 2022-12-16
  • 更新日: 2024-03-20

C言語の三項演算子の書き方

C言語ではてなマーク(?)を使った演算子と言えば三項演算子が有名です。
三項演算子を使うとif文を短くした式が書けるようになります。
しかしあまり使いすぎると逆にコードがわかりづらくなるため注意も必要な演算です。

結論としては三項演算子は

int a = 1;  
int b = a == 1 ? 2 : 3;  
printf("%d\n", b);  // 2  

のように使います。
この記事ではこの三項演算子について具体的に解説していきます。

C言語や他の言語を扱うYoutubeも公開しています。
興味がある方は以下のリンクからご覧ください。

Youtubeの当チャンネル

関連記事
C言語の演算子の一覧と解説

三項演算子の名前の由来

三項演算子は構成する要素が三項目あります。
項目は

  • 条件式
  • 式1
  • 式2

の3つです。
よってこれらを表現して三項演算子、あるいは三項目演算子と言われています。

三項演算子の構造

三項演算子ははてなマークコロンを使った書き方が特徴です。
構造としては↓のようになっています。

条件式 ? 式1 : 式2;  

三項演算子でははてなマークの前に条件式を書きます。
そしてその条件式が真(true)なら式1が実行され偽(false)なら式2が実行されます。

コードにすると、

1 ? printf("true\n") : printf("false\n");  

のように書くことができます。
↑のコードではまず条件式が「1」になっています。
1は真になるので実行されるのは式1、つまり「printf("true\n")」になります。
条件式を「0」に変更すると今度は「printf("false\n")」が実行されます。

0 ? printf("true\n") : printf("false\n");  

三項演算子の使い方

三項演算子のサンプルコードをもっと見てみたいと思います。
たとえば整数の値に応じて取得する文字列を変えるという三項演算子です。

int a = 1;  
printf("%s\n", a == 1 ? "one" : "other");  // one  

↑のように三項演算子は演算子なので色々なところに書くことができます。
↑の場合、結果は「one」になります。

また変数に値を代入するときも三項演算子を使うと式の文脈で条件分岐できます。

int a = 1;  
int b = a == 1 ? 2 : 3;  
printf("%d\n", b);  // 2  

↑の場合、変数bの値は「2」になります。
a == 1」が真になるので式1である2の分岐に移り、それが変数bに代入されるという感じです。

三項演算子は演算子なので優先順位が高く、式や文の中に入れて使うことができます。

三項演算子とif文の比較

三項演算子を理解するのに役立つのがif文との比較です。
たとえば↓の三項演算子を見てください。

int a = 1;  
a == 1 ? printf("one\n") : printf("other\n");  

この三項演算子をif文を使って書き直すと

int a = 1;  

if (a == 1) {  
    printf("one\n");  
} else {  
    printf("other\n");  
}  

というコードになります。
三項演算子も別に特別なことをしているわけではなく、分解すれば↑のようにif文で書き直すことができます。
しかし三項演算子を使えば1行で済んでいるコードがif文で書き直すと5行ぐらいになります。

このように三項演算子は省エネで短くコードを書くことができるのが特徴です。

複雑な三項演算子(ネスト)

三項演算子はネスト(入れ子)にすることもできます。
その場合の構造は

条件式A ? 条件式B ? 式B1 : 式B2 : 式A2 ;  

とか

条件式A ? 式A1 : 条件式B ? 式B1 : 式B2 ;  

になります。
パット見でなにをやってるかわかりますか?
私も自分で書いてて混乱してくる構造です。

これらをコードにすると前者は

printf("%d\n", 1 ? 2 ? 3 : 4 : 5);  // 3  

になり、
後者は

printf("%d\n", 0 ? 2 : 3 ? 4 : 5);  // 4  

になります。

🦝 < なにやってるのかよくわからないな

🐭 < カオスだ

三項演算子の注意点

三項演算子は便利そうに見えますが割と注意が必要な演算子です。
理由としては可読性です。

三項演算子を使うとコードが短くなるんですが、コードが短くなるというのは可読性が下がる場合があります。
ですのでif文を使って長いコードを書いた方が結果的にコードが見やすく美しくなるというのはよくある話です。

また三項演算子のネストはなかなか凶悪な可読性です。
ですので三項演算子でネストを行うと可読性が低下してコードがなにをやってるのかよくわからなくなる、という現象が起こってしまいます。
ですのでこの辺は注意が必要です。

三項演算子のプログラマーからの評判は?

三項演算子を嫌うプログラマーも大変多いです。
理由はやはりその可読性にあります。

特にグループ開発で三項演算子のネストなどを使った日にはその人への他の開発者からの好感度が低下する場合もあるでしょう。
それぐらい三項演算子は扱いが難しいところがあります。

しかしごくごくシンプルな式を書くときに使えば三項演算子は逆に可読性が上がることもあります。
ですので要は使いようになります。

個人開発で三項演算子を使ってみて実際にどれぐらい可読性に影響があるか確認してみるといいでしょう。

読みやすくした三項演算子のネスト

C系の三項演算子は読みやすくネストすることもできます。
その場合の構造は

変数 = 条件式1 ? 条件式1が真の時の式  
     : 条件式2 ? 条件式2が真の時の式  
     : 条件式3 ? 条件式3が真の時の式  
              : すべて偽だった時の式 ;  

このようになります。
こういった書き方をすれば三項演算子のネストも多少は見やすくなります。
しかし実践的な話としてこういった三項演算子のネストを書いている人はあまり見かけません。

どうしても三項演算子のネストを書きたい場合はこのように見た目の書き方を工夫するといいでしょう。

おわりに

今回はC言語のはてなマークを使った演算子、三項演算子について解説しました。
三項演算子は便利ですが使い過ぎには要注意です。

🦝 < 三項演算子で書き直しておきました

🐭 < ぐあー!読めねー!