三元运算符?: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;
**因此,这两者之间没有区别。 这对于程序员来说很容易编写,但对于编译器来说都是一样的。
不,它们被转换成完全相同的可执行代码。