🦁
if文内に初期化文と条件文のどちらも記述する
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 (初期化; 条件)
- 初期化が一回のみ実行される。
こちらはfor文の初期化と同じで、for文を更新文なしで使えば簡単に再現できてしまうため、わざわざ追加するメリットがあんまりないかもしれないです。
for (初期化; 条件;)
- 初期化が毎回実行される。
こちらの方がメリットがありそうですが、初期化が一回のみ実行されると誤解していると、以下のような無限ループを作ってしまいます。
// 毎回新しく先頭要素へのイテレータを取得するため、永遠に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
Discussion