🦁

if文内に初期化文と条件文のどちらも記述する

2024/09/08に公開

C++のfor文では、条件文の前に初期化文を記述できますが、

for (int i = 0; i < 5; i++)
{
    ...
}

c++17からは、if文でも条件文の前に初期化文を記述できるようになりました。

// result 
if (const int result = myFunction(); result == 0)
{
    std::cout << "myFunction succeeded with " << result << std::endl;
}
else if (result == -1)
{
    std::cout << "myFunction returned " << result << std::endl;
}
else
{
    std::cout << "myFunction failed with " << result << std::endl;
}

if文だけではなく、else if文の条件の中でも、else ifとelse文の中でもresultが使えるのが面白いですよね。

因みに、switch文でも同じことができるようになりました。

switch (const int result = myFunction(); result) {
    case 0:
        std::cout << "myFunction succeeded with " << result << std::endl;
        break;
    case -1:
        std::cout << "myFunction returned " << result << std::endl;
        break;
    default:
        std::cout << "myFunction failed with " << result << std::endl;
        break;
}

しかし、while文にはなぜか追加されなかったです。なんでwhileだけが仲間外れなのでしょうか?
憶測ですが、while文に初期化文を追加すると、以下の2つの解釈ができてしまうからだと思います。

while (初期化; 条件)
  1. 初期化が一回のみ実行される。

こちらはfor文の初期化と同じで、for文を更新文なしで使えば簡単に再現できてしまうため、わざわざ追加するメリットがあんまりないかもしれないです。

for (初期化; 条件;)
  1. 初期化が毎回実行される。

こちらの方がメリットがありそうですが、初期化が一回のみ実行されると誤解していると、以下のような無限ループを作ってしまいます。

// 毎回新しく先頭要素へのイテレータを取得するため、永遠にwhileから抜け出せない
while (auto it = v.begin(); it != v.end()) {
    ...
    it++;
}

最後に纏めると、以下になります。

if (条件)                  // C++98
if (初期化; 条件)          // C++17

switch (条件)              // C++98
switch (初期化; 条件)      // C++17

for (初期化; 条件; 更新)   // C++98

while (条件)               // C++98
do { ... } while (条件)    // C++98


|cpp記事一覧へのリンク|

Discussion