Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Safari/604.1.38
使用开关。
在最糟糕的情况下,编译器会生成与if-else链相同的代码,所以不会丢失任何东西。如果有疑问,将最常见的情况首先放入switch语句中。
在最好的情况下,优化器可能会找到更好的方法来生成代码。编译器通常做的事情是构建一个二叉决策树(在一般情况下保存比较和跳转)或者简单地构建一个跳转表(根本不需要比较)。
对于你在示例中提供的特例,最清晰的代码可能是:
if (RequiresSpecialEvent(numError))
fire_special_event();
显然,这只是将问题转移到代码的不同区域,但现在您有机会重用此测试。你也有更多的选择来解决它。你可以使用std :: set,例如:
bool RequiresSpecialEvent(int numError)
{
return specialSet.find(numError) != specialSet.end();
}