C++
 Computer >> コンピューター >  >> プログラミング >> C++

C++17で導入されたif文・switch文の初期化ステートメント(init-statement)の使い方

プログラミングでは、関数が返した値を検証し、その値に応じて条件分岐の処理を行いたい場面が数多くあります。従来のC++では、次のようにコードを書くのが一般的でした。

// 何らかのメソッドまたは関数
return_type foo(Params);

// 引数を渡して関数を呼び出し、
// 戻り値をvar1に格納する
auto var1 = foo(Params);
if (var1 == /* 何らかの値 */) {
    // 何らかの処理を行う
} else {
    // 別の処理を行う
}

上記のコードは、一般的なif-elseブロックの形式に従っています。まず変数をセットアップする初期化ステートメント(省略可能)があり、その後にif-elseブロックが続きます。つまり、一般的なif-elseブロックは以下のような構造になります。

init-statement
if (condition) {
    // 何らかの処理を行う
} else {
    // 別の処理を行う
}

C++17での新しい書き方

C++17では、この初期化ステートメントは「イニシャライザ(initializer)」と呼ばれ、if-elseブロックの中に直接組み込むことができるようになりました。書き方は以下の通りです。

if (init-statement; condition) {
    // 何らかの処理を行う
} else {
    // 別の処理を行う
}

スコープが限定されるメリット

この構文の大きな利点は、条件式で使う変数のスコープが現在のif-elseブロック内に限定されることです。これにより、別の条件分岐ブロックでも同じ名前の識別子を再利用できるようになります。

if (auto var1 = foo(); condition) {
    ...
}
else {
    ...
}
// 別のif-elseブロック
if (auto var1 = bar(); condition) {
    ....
}
else {
    ....
}

同様に、switch文もC++17で更新されました。switchの括弧内に初期化式を直接記述できるようになっています。

初期化ステートメントの後には、どの変数を使ってcaseを判定するのかを指定する必要があります。

switch (initial-statement; variable) {
    ....
    // 各caseの処理
}

完全なサンプルプログラム

以下は、C++17で導入されたif文・switch文の初期化機能を説明するためのサンプルプログラムです。

// C++17で導入されたinit付きif-elseの
// 機能を説明するためのプログラム
#include <iostream>
#include <cstdlib>
using namespace std;
int main() {
    // プログラム内で後ほど使用するため
    // rand関数を初期化する
    srand(time(NULL));

    // C++17以前の書き方
    int I = 2;
    if (I % 2 == 0)
        cout << I << " is even number" << endl;

    // C++17以降の書き方
    // if(init-statement; condition)
    if (int I = 4; I % 2 == 0)
        cout << I << " is even number" << endl;

    // switch文の場合
    // switch(init; variable)
    switch (int I = rand() % 100; I) {
        default:
            cout << "I = " << I << endl;
            break;
    }
}

まとめ

C++17の初期化ステートメントを活用すると、変数の宣言と条件判定をひとつの文にまとめられ、コードがより簡潔になります。さらに、変数のスコープがif文やswitch文のブロック内に限定されるため、意図しない場所からの変数参照を防ぎ、バグの発生リスクを低減できます。特に一時的な変数を扱う場合や、同じ名前の変数を複数の条件分岐で使いたい場合に有効な機能です。

  1. JavaScriptの条件分岐とは?if文・else文・else if文の使い方を解説

    JavaScriptには、条件に応じて処理を切り替えるための「条件分岐(条件文)」が用意されています。条件式が真(true)か偽(false)かを評価することで、実行するコードを制御できます。代表的な条件文は次の3種類です。 if文 − 指定した条件が満たされた場合にのみ、ifブロック内のコードを実行します。最も基本的な条件分岐です。 if…else文 − 条件が真の場合と偽の場合で、それぞれ異なる処理を実行したいときに使います。2つのケースを切り替えるのに適しています。 if…else if…else文 − 3つ以上の条件を扱いたい場合に使用します。条件を上から順に評価し、最初に一致したブ

  2. CSSとJavaScriptでダークモード/ライトモードを切り替える方法を解説!

    ダークモードとは?導入のメリット ダークモードは、夜間や暗い場所での閲覧時に目への負担を軽減できるうえ、有機EL(OLED)ディスプレイ搭載のスマートフォンやPCではバッテリー消費を抑えられる効果も期待できる、近年多くのWebサービスで標準となっている機能です。この記事では、CSSとJavaScriptを組み合わせて、ボタン操作ひとつでダークモードとライトモードを切り替える方法を、実際に動くサンプルコード付きで解説します。 切り替えの仕組み 実装の考え方は非常にシンプルです。まず、ライトモード(白背景・黒文字)のスタイルをbody要素のデフォルトとして定義し、ダークモード(黒背景・白文字)用の