🤔

do-while(false)は何のためにあるのか

2020/09/27に公開

C++のコードで見つけたけどそれ以外でも使うそうで。

do {
	bool ret = func();
	if (!ret) {
		break;
	}

	// 省略
} while(false);

なんだこれは。一瞬無限ループかと思ったが条件が false だから
一回もループせずに抜けてしまうじゃないか。何をしたいんだ

と思ってググったら「breakで抜けることができる」=「gotoや例外を使わないで済む」ということらしい。

do {
	bool ret = func();
	if (!ret) {
		break;
	}

	// ←func()がtrueのときのみ処理したい
} while(false);

// 以降はfunc()がtrue/false関係なしに処理

上記の例だと

bool ret = func();
if (ret) {
	// ←func()がtrueのときのみ処理したい
}

これでいいじゃん、
となるが func() に当たるのが3つもあるとネストが深くなってしまう

bool ret = func();
if (ret) {
	// なんか処理

	ret = func1();
	if (ret) {
		ret = func2();
		// ←func(), func1(), func2()がtrueのときのみ処理したい
	}
}

これが do-while(false) ならすっきりする。らしい。

do {
	bool ret = func();
	if (!ret) {
		break;
	}

	// なんか処理

	ret = func1();
	if (!ret) {
		break;
	}

	ret = func2();
	if (!ret) {
		break;
	}

	// ←func(), func1(), func2()がtrueのときのみ処理したい
} while(false);

「今は func() に当たるのが1つしかないから無駄に見えるが、
今後の拡張性を考えて do-while(false) にしている」というのもある。
あとはコンフリクトを避けるとか

参考

Discussion