C++17の初期化子付きif文の使い方を徹底解説
C++17では、既存のif文の構文が拡張されました。これにより、if文自体の中に初期化処理を直接記述できるようになっています。この新しい構文は「初期化子付きif文(if statement with initializer)」と呼ばれます。この機能強化により、よく使われるコードパターンが簡潔になり、変数のスコープを狭く保つことが容易になりました。その結果、変数が意図せずスコープ外に漏れ出すことを防ぐことができます。
従来の書き方(C++17以前)
例として、ある数値が偶数か奇数かを判定するプログラムを考えてみましょう。C++17以前では、コードは次のように記述していました。
#include <iostream>
#include <cstdlib>
using namespace std;
int main() {
srand(time(NULL));
int random_num = rand();
if (random_num % 2 == 0) {
cout << random_num << " is an even number\n";
} else {
cout << random_num << " is an odd number\n";
}
return 0;
}
実行結果
上記のコードをコンパイルして実行すると、次のような出力が得られます。
1555814729 is an odd number
この例では、変数「random_num」がif-elseブロックの外側に漏れ出していることがわかります。if文の条件判定のためだけに使う変数が、その後もスコープ内に残ってしまうのは好ましくありません。この問題は、新しい「初期化子付きif文」の構文を使えば簡単に解決できます。
初期化子付きif文の構文
「初期化子付きif文」の基本構文は以下のとおりです。
if (init; condition) {
// 条件式がtrueの場合の処理
} else {
// 条件式がfalseの場合の処理
}
セミコロン(;)の前に初期化処理を、後に条件式を記述します。初期化された変数は、このif-elseブロック内でのみ有効になります。
初期化子付きif文を使った書き方
それでは、先ほどと同じコードを新しい構文で書き直してみましょう。
#include <iostream>
#include <cstdlib>
using namespace std;
int main() {
srand(time(NULL));
// C++17の初期化子付きif文
if (int random_num = rand(); random_num % 2 == 0) {
cout << random_num << " is an even number\n";
} else {
cout << random_num << " is an odd number\n";
}
return 0;
}
この例では、変数「random_num」のスコープがif-elseブロック内に限定されています。そのため、このブロックの外側からは変数にアクセスできません。驚くべきことに、実際の出力に影響を与えることなく、変数のスコープを狭く保つことができます。
実行結果
上記のコードをコンパイルして実行すると、次のような出力が得られます。
943513352 is an even number
注意: 乱数を毎回生成しているため、同じマシンで実行しても、実行するたびに出力結果は異なります。
まとめ
C++17の初期化子付きif文を使うことで、条件判定にのみ必要な変数のスコープをif-elseブロック内に限定できます。これにより、名前の衝突を防ぎ、コードの意図が明確になり、バグの発生リスクも低減します。同様の構文はswitch文(初期化子付きswitch文)でも利用可能であり、モダンC++における可読性の高いコードを書くための重要な機能となっています。
-
【初心者向け】JavaScriptのfinallyステートメントをサンプルコード付きでわかりやすく解説
finallyステートメントは、エラーが発生したかどうかにかかわらず、tryブロックとcatchブロックの処理が完了した後に必ず実行されるブロックです。ファイルのクローズやデータベース接続の切断など、処理の成功・失敗に関係なく必ず実行したい後処理(クリーンアップ処理)を記述する際に非常に便利です。finallyの基本構文try { // エラーが発生する可能性のある処理 } catch (err) { // エラー発生時に実行される処理 } finally { // エラーの有無にかかわらず必ず実行される処理 }サンプルコード以下は、JavaScriptにおけるfinallyステー
-
JavaScriptのwithステートメントとは?用途と使い方をわかりやすく解説
JavaScriptのwithステートメントは、特定のプロパティに対してデフォルトのオブジェクトを指定し、冗長になりがちなオブジェクト参照の記述を省略するための構文です。withブロック内で指定したオブジェクトは、スコープチェーンの先頭に追加されるため、そのプロパティ名だけで直接アクセスできるようになります。 基本的な動作 通常、オブジェクトのプロパティにアクセスするには、毎回オブジェクト名を明示する必要があります。しかし、withステートメントを使えば、以下のようにコードを簡潔に書けます。 オブジェクト名の繰り返し記述を省略できる 同じオブジェクトの複数のプロパティへ短くアクセスできる 指