三元运算符?:vs if … else

在C ++中,?:操作符比if()… else语句更快吗? 他们之间有编译代码之间的任何区别?

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

这不是更快。 有一个区别,你可以根据一些expression式初始化一个常量variables:

 const int x = (a<b) ? b : a; 

你不能用if-else来做同样if-else

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

不能保证他们会编译成相同的代码。 如果你需要performance,那么一如既往, 衡量 。 当你测量并发现了1.你的代码太慢了,2.这是罪魁祸首的特定块代码,然后研究编译器生成的汇编代码,并检查自己正在发生的事情。

不要相信黄金法则,比如“如果我使用条件运算符,编译器总是会生成更高效的代码”。

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

 printf("Total: %d item%s", cnt, cnt != 1 ? "s" : ""); 

用if / else做这个语句,会产生一个非常不同的编译代码。

只是有点左手…

 x ? y : x = value 

如果x不是0(假),将赋值给y

不pipe编译的代码如何,它们在语义上是不同的。 <cond>?<true expr>:<false expr>是一个expression式, if..else..是一个语句。

尽pipe条件expression式的语法看起来很尴尬,但这是一件好事。 你被迫提供一个<false expr>并且这两个expression式被检查。

相当于if..else..在基于expression式的function语言如Lisp,Haskell中是? : ? :在C ++中,而不是if..else..语句。

现在我无法帮助你,我可能会帮助下面的第二个问题,我想用它吗? 如果你只是想知道速度,只是忽略我的评论。

我能说的是,请在使用三元时非常聪明? :运营商。 为了可读性,它可能是一个福音,也是一个诅咒。

问问你自己,如果你觉得使用它之前更容易阅读

 int x = x == 1 ? x = 1 : x = 1; if (x == 1) { x = 1 } else { x = 2 } if (x == 1) x = 1 else x = 1 

是的,让代码100%伪造,看起来很愚蠢。 但是这个小技巧帮助我分析了代码的可读性。 这是您在本示例中查看的操作员的可读性,而不是内容。

它看起来干净,但平均马桶座圈和门把手也是如此

根据我的经验,这是有限的,我看到实际上很less有人能够快速地引入三元运算符所需的信息,除非100%确定它更好。 当我想到的时候修正它是一个痛苦

我预计在大多数编译器和目标平台上,会出现“if”更快的情况,以及更快的情况。 也会有一种forms比另一种forms多或less的情况。 在编译器和平台之间,哪一种情况会支持一种forms或另一种forms。 如果您在embedded式微代码上编写性能至关重要的代码,请查看编译器在每种情况下生成的内容,并查看哪个更好。 在“主stream”个人电脑上,由于存在caching问题,唯一的办法就是将这两种forms的基准与真实应用程序类似。

在反转一些代码(我不记得,几年前),我看到机器代码之间的单线差异:? 如果 – 别的。 Don't remember much but it is clear that implementation of both is different.

但是我build议你不要select其中一个b'coz的效率,根据代码的可读性或者你的方便性来select。 快乐的编码

三元运算符总是返回一个值。 所以在你想从结果中得到一些输出值的情况下,只有两个条件总是最好使用三元运算符。 如果上述任何条件不成立,则使用if-else。

我认为有些情况下,内联如果可以产生“更快”的代码,因为它的工作范围。 对象创build和销毁可能代价高昂,因此请考虑以下情况:

 class A{ public: A() : value(0) { cout << "Default ctor" << endl; } A(int myInt) : value(myInt) { cout << "Overloaded ctor" << endl; } A& operator=(const A& other){ cout << "= operator" << endl; value = other.value; } ~A(){ cout << "destroyed" << std::endl; } int value; }; int main() { { A a; if(true){ a = A(5); }else{ a = A(10); } } cout << "Next test" << endl; { A b = true? A(5) : A(10); } return 0; } 

有了这个代码,输出将是:

 Default ctor Overloaded ctor = operator destroyed destroyed Next test Overloaded ctor destroyed 

所以通过内联if,我们可以节省一大堆与b相同的操作。 在两种情况下,条件评估速度很可能相当相同,但是更改范围会迫使您考虑内联if允许您避免的其他因素。

你不是被迫把这一切放在一个线上:

 x = y==1 ? 2 :// else 3; 

它比if / else要清楚得多,因为你可以立即看到两个分支都导致了x的分配。

在CA三元运算符“?:”可用于构造表单的条件expression式

 exp1 ? exp2:exp3 

exp1,exp2和exp3是expression式

例如

  a=20; b=25; x=(a>b)?a:b; in the above example x value will be assigned to b; 

这可以使用if..else语句来编写,如下所示

  if (a>b) x=a; else x=b; 

**因此,这两者之间没有区别。 这对于程序员来说很容易编写,但对于编译器来说都是一样的。

不,它们被转换成完全相同的可执行代码。