c++ - 现代编译器会自动优化以下 C++ 代码吗?

标签 c++ if-statement g++

如果我使用以下代码,编译器是否会像使用二叉树来搜索值的 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/

相关文章:

C++ "No appropriate default constructor available"

c++ - 为什么 g++/ld 内存不足?

linux - 包括 cpufreq.h 但在 linux c++ 中显示链接器错误

c++ -/** 在 C++ 中是什么意思

c++ - 检查数组中的相似元素并转移到新数组

c++ - 在 c/c++ 中创建时间戳的可移植方式

Java扫描器命令系统

java - 为什么 Booleanexecute(String SQL) 总是 true,即使我的输入不在我的数据库中

c - if语句成功后如何停止? C语言编程

gcc - 我的第一个汇编程序出错(GCC 内联汇编)