三項演算子とは?if文を1行で書ける条件演算子
「この条件のときはAを、そうじゃなければBを返したい」──コードを書いていると、こんな場面がよく出てきますよね。
三項演算子(さんこうえんざんし)は、if-elseの条件分岐を1行で書ける演算子です。正式には「条件演算子(conditional operator)」と呼ばれ、英語では「ternary operator」と表記されます。「三項」という名前は、オペランド(被演算子)を3つ取る唯一の演算子であることに由来しています。
多くの言語で共通する基本構文は以下のとおりです。
条件式 ? 真のときの値 : 偽のときの値具体例を見てみましょう。JavaScriptで「年齢が18以上なら”成人”、そうでなければ”未成年”」を返すコードです。
const label = age >= 18 ? "成人" : "未成年";条件式の部分はブーリアン(boolean)型に評価される式を書きます。?の後が真の場合の値、:の後が偽の場合の値です。
if文と三項演算子を比べてみよう
同じ処理をif文と三項演算子で書いたとき、どのくらい違うのかを比較してみます。
if文で書いた場合:
let message;
if (score >= 80) {
message = "合格";
} else {
message = "不合格";
}三項演算子で書いた場合:
const message = score >= 80 ? "合格" : "不合格";6行のコードが1行になりました。さらにポイントとして、三項演算子を使うとconstで宣言できます。if文の場合は後から代入するためletにする必要がありますが、三項演算子なら式として値を返せるのでconstで変数を不変にでき、意図しない再代入を防げます。
ただし、三項演算子はあくまで「式(expression)」であり「文(statement)」ではありません。if文のように複数の処理を実行するのではなく、値を返すことが目的です。この違いを意識しておくと、使いどころを間違えにくくなります。
主要言語の書き方まとめ
三項演算子はほとんどのプログラミング言語でサポートされていますが、書き方が少し異なります。代表的な5言語の構文をまとめました。
| 言語 | 構文 | 備考 |
|---|---|---|
| JavaScript | 条件 ? 真 : 偽 |
JSX内でも頻繁に使用 |
| Python | 真 if 条件 else 偽 |
順番が異なるので注意 |
| PHP | 条件 ? 真 : 偽 |
PHP 5.3以降は?:で省略形も可 |
| Java | 条件 ? 真 : 偽 |
型の一致に注意が必要 |
| Ruby | 条件 ? 真 : 偽 |
if-then-else-endも1行で書ける |
それぞれの言語でコード例を見てみましょう。
JavaScript / TypeScript
const status = isActive ? "有効" : "無効";
console.log(status); // isActiveがtrueなら "有効"Python
# Pythonは順番が独特:「真の値 if 条件 else 偽の値」
status = "有効" if is_active else "無効"
print(status)Pythonだけは真の値 if 条件 else 偽の値という順番になります。他の言語に慣れている方が最も間違えやすいポイントなので、覚えておきましょう。
PHP
$status = $is_active ? "有効" : "無効";
// PHP 5.3以降:Elvis演算子(省略形)
// 条件式がtruthyならその値自体を返す
$name = $username ?: "ゲスト";Java
String status = isActive ? "有効" : "無効";
System.out.println(status);Ruby
status = is_active ? "有効" : "無効"
# Rubyらしい書き方:後置ifも使える
status = if is_active then "有効" else "無効" end実務で使える!三項演算子の活用パターン
三項演算子が特に活きる実務上のユースケースを紹介します。ここではJavaScriptをベースに解説しますが、考え方は他の言語でも同様です。
パターン1:変数の初期化
条件に応じて変数の値を切り替えるケースは、三項演算子のもっとも基本的な使い方です。
// デフォルト値の設定
const displayName = user.name ? user.name : "匿名ユーザー";
// 数値の分岐
const fee = isMember ? 0 : 500;パターン2:return文での使用
関数の戻り値を条件で分けたいとき、三項演算子ならreturn文の中に直接書けます。
function getGreeting(hour) {
return hour < 12 ? "おはようございます" : "こんにちは";
}パターン3:テンプレートリテラル内での使用
文字列の組み立てで、一部だけ条件で切り替えたいときに便利です。
const message = `ご注文は${count}点、${count >= 3 ? "送料無料" : "送料別"}です`;
console.log(message); // "ご注文は5点、送料無料です"パターン4:React(JSX)での条件レンダリング
Reactの開発では、JSX内でif文が使えないため三項演算子が事実上の標準になっています。
return (
<div>
{isLoggedIn ? <Dashboard /> : <LoginForm />}
<p>{items.length > 0 ? `${items.length}件` : "データなし"}</p>
</div>
);やりがちなアンチパターン3選
三項演算子は便利ですが、使い方を間違えると読みにくいコードの原因になります。よくある失敗パターンを3つ紹介します。
アンチパターン1:ネスト(入れ子)地獄
三項演算子の中にさらに三項演算子を入れる「ネスト」は、コードの可読性を大きく下げます。
// ❌ 悪い例:何をしているか一目でわからない
const label = score >= 90 ? "S" : score >= 80 ? "A" : score >= 70 ? "B" : "C";
// ✅ 良い例:if-else ifで素直に書く
let label;
if (score >= 90) {
label = "S";
} else if (score >= 80) {
label = "A";
} else if (score >= 70) {
label = "B";
} else {
label = "C";
}条件が3つ以上になったら、三項演算子ではなくif-else ifやswitch文を検討しましょう。
アンチパターン2:副作用のある式を入れる
三項演算子は「値を返す」ための演算子です。副作用(変数への代入や関数呼び出しなど)を目的に使うと、意図が伝わりにくくなります。
// ❌ 悪い例:三項演算子をif文の代わりに使っている
isValid ? submitForm() : showError();
// ✅ 良い例:if文で意図を明確にする
if (isValid) {
submitForm();
} else {
showError();
}「値を返したい」のか「処理を分岐したい」のかで、三項演算子とif文を使い分けるのが大切です。
アンチパターン3:長すぎる式を詰め込む
条件式や返す値が長いと、1行に収まっても読みづらくなります。
// ❌ 悪い例:1行が長すぎて読めない
const result = userProfile.settings.notifications.email.isEnabled ? sendEmailNotification(user.email) : logSkippedNotification(user.id);
// ✅ 良い例:if文で分割するか、変数に切り出す
const shouldNotify = userProfile.settings.notifications.email.isEnabled;
if (shouldNotify) {
sendEmailNotification(user.email);
} else {
logSkippedNotification(user.id);
}三項演算子を使う?使わない?判断基準チェックリスト
実務で迷ったときに参考にできる判断基準を表にまとめました。
| チェックポイント | 三項演算子を使う | if文を使う |
|---|---|---|
| 条件の数 | 2択(true / false)のみ | 3つ以上の分岐がある |
| 目的 | 値を返したい | 処理を分岐したい |
| コードの長さ | 1行に収まる | 長くなる・複雑になる |
| 返す値 | シンプルな値や短い式 | 関数呼び出しや副作用を含む |
| チームの方針 | 三項演算子の使用がOK | コーディング規約で禁止 |
迷ったらif文で書くのが安全です。三項演算子は「読みやすさが上がるとき」だけ使うという方針にしておくと、チーム開発でもトラブルになりにくくなります。なお、コーディング規約で三項演算子の使用を制限しているプロジェクトも少なくありません。ESLintのno-ternaryルールやno-nested-ternaryルールなど、リンターで機械的に制御する方法もあります。
まとめ
この記事では、三項演算子の基本構文から言語別の書き方、実務での活用パターン、そしてやりがちなアンチパターンまでを解説しました。
改めてポイントを整理すると、三項演算子はif-elseを1行で書ける条件演算子であり、基本構文は条件 ? 真 : 偽です(Pythonのみ真 if 条件 else 偽)。変数の初期化やreturn文、テンプレートリテラル、ReactのJSX内での条件レンダリングなど、値を返すシンプルな二択の場面で特に力を発揮します。一方で、ネストや副作用のある使い方は避け、読みやすさが向上するケースでのみ使うのが実務での鉄則です。
まずは普段のコードで「if-elseを1行にできそうな場所」を探してみてください。三項演算子を正しく使いこなせれば、コードの見通しがぐっと良くなるはずです。
三項演算子の理解をさらに深める関連記事
三項演算子の基本を押さえたら、プログラミングの土台となる知識もあわせて強化しておきましょう。
- ブーリアン(boolean)の使い方と意味をわかりやすく解説 - 三項演算子の条件式で必ず登場するboolean型の基礎を理解できます
- コマンドラインの基本と活用方法 - 開発環境のセットアップやツール操作に欠かせないCLIの入門ガイドです
