如果我使用以下代码,编译器是否会像使用二叉树来搜索值的 switch 结构一样对其进行优化?
if ( X == "aaaa" || X == "bbbb" || X == "cccc" || X == "dddd" )
{
}
else if ( X == "abcd" || X == "cdef" || X == "qqqq" )
{
}
这只是一个示例,引号内的内容没有任何模式
更新
好吧,X是一个字符串,但我真的认为这并不重要,我只是想知道,当if
中的所有内容都是关于单个变量时,它会被优化吗?
最佳答案
这些值将被一个接一个地比较,因为这是 ||
或短路运算符的要求。所以,这里会发生两件事:
- X 将从右到左进行逐一比较。
- 任何比较成功后都不会再进行比较(因为它是短路 OR 运算符),即在以下情况下
例如:
int hello() {
std::cout<<"Hello";
return 10;
}
int world() {
std::cout<<"World";
return 11;
}
int hello2() {
std::cout<<"Hello2";
return 9;
}
int a = 10;
bool dec = (a == hello() || a == world())
bool dec = (a == hello2() || a == hello() || a == world())
第一个语句的输出将是:
Hello
as a == world()
将不会被执行,而对于第二个 Hello2 Hello
,因为比较会继续发生,直到第一次成功。
对于 &&
运算符,比较会一直进行,直到第一次失败(因为这足以确定整个语句的结果)。
关于c++ - 现代编译器会自动优化以下 C++ 代码吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9359319/