三元运算符?:vs if ... else

Xir*_*dus 69 c++ performance conditional-operator

在C++中,?:运算符比if()... else语句更快?它们在编译代码中有什么区别吗?

Kir*_*sky 93

它并不快.根据某个表达式初始化常量变量有一个区别:

const int x = (a<b) ? b : a;
Run Code Online (Sandbox Code Playgroud)

你不能这样做if-else.

  • @Developer Art:使用`const`变量是不可能的. (18认同)
  • 那个好的''max`怎么样?`const int x = max(a,b);`工作正常. (7认同)
  • 好的lambda会为if/else :)"解决"这个哈哈 (3认同)
  • @bobobobo哈!当我阅读您的评论时,我以为您建议的命令是`max?const int x = max(a,b);`并且认为哇!WTF就是这样!然后我又读了一遍,发现问号不是等宽的!给定主题,我认为我有理由考虑?是命令的一部分!:) (3认同)
  • 您可以使用 const int x = [&amp;] -&gt; int { if (a &lt; b) return b; 否则返回a;}`。 (2认同)

pto*_*ato 84

取决于您的编译器,但在任何现代编译器上通常没有区别.这是你不应该担心的事情.专注于代码的可维护性.

  • 关于代码的可维护性,我更喜欢... else.至少对我来说它更容易阅读. (3认同)
  • @Exa:取决于上下文.初始化对象时,三元运算符通常更好. (2认同)
  • @kotlinski,我并不是说条件比 if 更难维护。它们在某些不同的情况下都更加清晰,如上面链接的_三元或不三元_问题的答案中所述。 (2认同)

jal*_*alf 40

我已经看到GCC将条件运算符转换为cmov(条件移动)指令,同时将if语句转换为分支,这意味着在我们的情况下,使用条件运算符时代码更快.但那是在几年前,而且很可能在今天,两者都会编译成相同的代码.

无法保证他们将编译为相同的代码.如果您需要性能,那么一如既往地进行测量.当你测量并发现1.你的代码太慢,并且2.这是特定的代码块是罪魁祸首,然后研究编译器生成的汇编代码并自己检查发生了什么.

不要相信黄金规则,"如果我使用条件运算符,编译器将始终生成更高效的代码".

  • +1。当我使用 GCC 为 PS3 开发时,使用条件而不是“if”有助于避免分支。 (2认同)
  • @zoujyjs不,C有相同的规则.但是在as-if规则下,只要最终结果是正确的,编译器就可以自由作弊.因此,只要没有副作用,编译器就可以进行此优化. (2认同)

Jam*_*ran 15

它们是相同的,但是,三元运算符可以在难以使用if/else的地方使用:

printf("Total: %d item%s", cnt, cnt != 1 ? "s" : "");
Run Code Online (Sandbox Code Playgroud)

使用if/else执行该语句将生成非常不同的编译代码.


8年后更新......

实际上,我认为这会更好:

printf(cnt == 1 ? "Total: %d item" : "Total: %d items", cnt);
Run Code Online (Sandbox Code Playgroud)

(实际上,我很确定你可以用"one"替换第一个字符串中的"%d")

  • 甚至不会需要一个三元操作符:`的printf( "总:%d项%s" 时,CNT, "S" +(CNT == 1));` (7认同)
  • @Quirk:`(cnt==1)` 是真还是假,它会转换为 0 或 1。“s”是指向以空字符结尾的字符串的指针。添加一个跳过一个字符(s)。所以这会打印“s”或“”。 (2认同)