if で判断する
プログラムは絶えずデータに反応します。合格か不合格か、在庫ありか売り切れか、有効か無効か。if 文は、C++ が条件に基づいてどのコードを実行するかを選ぶ仕組みです。
if は括弧の中に条件を取り、その条件が真のときだけ波括弧の中のブロックを実行します。
条件 score >= 60 は真なので、メッセージが出力されます。閉じ波括弧の後の行は常に実行されます — これは if の外にあるからです。score を 40 に変えると、「passed」の行は完全にスキップされます。
条件は bool に変換されます。>、>=、==、!= のような比較はすでに bool を返しますが、C++ は 0 以外の数値をすべて真、0 を偽として扱うため、if (count) は「count が 0 でなければ」という意味になります。この暗黙の変換は便利ですが、下で見るいくつかの典型的なバグの原因でもあります。
else を加える
else は「そうでなければ」の経路を与えます — 条件が偽のときだけ実行されるコードです。
2 つのブロックのうちちょうど 1 つだけが実行されます — 両方になることも、どちらも実行されないこともありません。else には固有の条件がなく、単に if が捕まえなかったものをすべて受け止めます。
else if で連鎖させる
結果が 2 つより多いときは、else if で条件を連鎖させます。C++ は上から下へ調べ、条件が真である最初のブロックを実行し、残りはスキップします。
順序が重要です。84 はまず >= 90(偽)、次に >= 80(真)と判定されるため、B で止まり、下限はまったく調べられません。だからこそ score >= 80 && score < 90 も不要です — 2 番目の分岐に到達した時点で、score が 90 未満だったことはすでに保証されています。最も範囲の狭い条件、または最も優先度の高い条件を先に置きましょう。
C++ には elif キーワードがないことに注意してください — else if は文字どおり、本体がもう 1 つの if である else です。波括弧によって 1 つのはしごのように読めるだけです。
大きな落とし穴: = と ==
C と C++ で最もよくある if 文のバグは、==(比較)のつもりで =(代入)と書いてしまうことです。
x = 5 は 5 を x に代入し、式全体は 5 と評価され、それが true に変換されます — そのため分岐は常に実行され、x を気づかぬうちに書き換えてしまいます。これはコンパイルが通り、ほとんどのコンパイラは警告を出すだけです。防御策は 2 つあります。警告を有効にして(-Wall)コンパイラに指摘させること、そして定数を前に置くこと(if (5 == x))を検討すること。if (5 = x) はコンパイラが即座に捕まえる致命的なエラーになるからです。
同じ罠は bool でも潜んでいます。if (ready = true) はコンパイルが通り代入してしまいますが、if (ready == true)(あるいは単に if (ready))は比較します。
条件の組み合わせとネスト
条件は &&(かつ)、||(または)、!(否定)で組み合わせます。また、ある検査が前の検査を通過した後でのみ意味を持つ場合は、if を別の if の中にネストします。
&& と || は短絡評価します。a && b で a が偽なら、C++ は b を評価しません。これは不正なメモリアクセスを防ぐのに不可欠です — if (ptr != nullptr && ptr->ready) が安全なのは、ptr が null のときにはポインタの参照外しがスキップされるからです。可能なら深いネストよりも && による平坦化を選びましょう。平坦な条件は、波括弧のピラミッドよりも読みやすくなります。
見た目どおりの意味にならない比較の連鎖に注意してください。if (0 < x < 10) は範囲を検査しません。これは 0 < x を bool(0 または 1)に評価し、それを 10 と比較します — 常に真です。代わりに if (0 < x && x < 10) と書きましょう。
三項演算子
2 つの値の間で選ぶだけなら、三項演算子 ?: はコンパクトな一行になります。condition ? a : b は「条件が真なら a、そうでなければ b」と読みます。
三項演算子は、代入したり、渡したり、直接出力したりできる値を生み出します — 単純な if にはできないことです。単純な選択にとどめましょう。どちらかの分岐に複数の文や本格的なロジックが必要なら、ネストした三項演算子がすぐにパズルになる場面でも、完全な if-else なら読みやすさを保てます。(細かな注意点: 両方の分岐は共通の型を持たねばならないので、たとえば文字列 (string) と int を混ぜないでください。)
初期化子付き if(C++17)
C++17 以降、if の中で変数を宣言でき、そのスコープは if/else だけに限定されます。これにより、短命なヘルパーが周囲のコードに漏れ出すのを防げます。
; の前の部分は一度だけ実行され、その結果は条件と else の両方で見えます。これは「何かを計算してから、それに基づいて分岐する」というパターンに最適です — そして結果の変換が最初に一度だけ行われるため、後で再計算したり、誤って古い値を再利用したりするのを避けられます。一時的な値が分岐のためだけに必要なときは、これを使いましょう。
落とし穴: ぶら下がり波括弧の罠
C++ では、分岐が単一の文のとき波括弧を省略できますが、これは微妙なバグを招きます — インデントが嘘をつくのです。
if (loggedIn)
cout << "Welcome\n";
cout << "Loading dashboard\n"; // if の一部ではない!
if に制御されるのは最初の行だけで、2 行目はインデントが示すこととは裏腹に、loggedIn に関係なく常に実行されます。関連する典型例は迷子のセミコロンです。if (x > 0); は空の本体で if を終わらせるため、その後のブロックは無条件で実行されます。常に波括弧を使えば — たった 1 行でも — この種の間違いはほとんど消えます。
次へ: switch
if-else if の連鎖は、各分岐が異なる条件を検査するときに最適です。しかし、1 つの値を多数の固定された候補と照合する場合 — メニューの選択、列挙型、ステータスコードなど — 長い else if のはしごは冗長になり、順序を間違えやすくなります。switch 文はまさにそのために作られており、それが次のページの内容です。
よくある質問
C++ で if-else 文はどう書きますか?
if の後の括弧に条件を、実行するコードを波括弧に入れ、条件が偽のときのために任意の else ブロックを書きます: if (score >= 60) { cout << "Pass"; } else { cout << "Fail"; }。条件は bool に変換されるため、0 以外の数値はすべて真として扱われ、0 は偽として扱われます。
C++ の if 文で = と == の違いは何ですか?
== は 2 つの値が等しいかを比較しますが、単一の = は代入します。if (x = 5) と書くと 5 を x に代入してから 5 を判定する(常に真)という典型的なバグになります。警告だけでコンパイルが通るので、警告を有効にし、定数を先に書くこと(if (5 == x))を検討しましょう。
C++ の三項演算子とは何ですか?
三項演算子 condition ? valueIfTrue : valueIfFalse は、値を生み出すコンパクトな if-else です。たとえば string label = age >= 18 ? "adult" : "minor"; は 2 つの値のうち一方を選びます。単純な値の選択に使い、各分岐に本格的なロジックがある場合は完全な if-else を使いましょう。