关于c ++:三元运算符?:vs if … else

Ternary operator ?: vs if…else

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


它不快。当您可以根据某个表达式初始化常量变量时,有一个区别:

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

你不能对if-else做同样的事情。


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


我见过gcc将条件运算符转换成EDOCX1(条件移动)指令,而将if语句转换成分支,这意味着在我们的例子中,使用条件运算符时代码更快。但那是几年前的事了,而且很可能是今天,两者都会编译成相同的代码。

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

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


但是,它们是相同的,三元运算符可用于难以使用if/else的位置:

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

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

8年后更新…

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

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

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


不管编译的代码是什么,它们在语义上都是不同的。?:是一个表达式,if..else..是一个语句。

虽然条件表达式的语法看起来很笨拙,但它是一件好事。您必须提供一个,这两个表达式都经过类型检查。

在基于表达式的函数语言(如Lisp,Haskell)中,EDCOX1等于3是EDCOX1(6)在C++中,而不是EDCOX1×3的语句。


只是有点左撇子…

1
x ? y : x = value

如果x不是0(假),则将为y赋值。


你不必把这些都放在同一行上:

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

它比if/else更清晰,因为您可以立即看到两个分支都导致x被分配给。


我认为在某些情况下,由于内联if的工作范围,它可以生成"更快"的代码。对象创建和销毁成本高昂,因此请考虑以下场景:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
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;
}

使用此代码,输出将是:

1
2
3
4
5
6
7
8
Default ctor                                                                                                                                                                                                                      
Overloaded ctor                                                                                                                                                                                                                  
= operator                                                                                                                                                                                                                        
destroyed                                                                                                                                                                                                                        
destroyed                                                                                                                                                                                                                        
Next test                                                                                                                                                                                                                        
Overloaded ctor                                                                                                                                                                                                                  
destroyed

因此,通过引入if,我们节省了一系列操作,以使a在与b相同的范围内保持活动。虽然在这两个场景中,条件评估速度很可能是相等的,但是更改范围会迫使您考虑内联if允许您避免的其他因素。


三元运算符始终返回值。所以,在您希望从结果中得到一些输出值的情况下,只有两个条件总是更好地使用三元运算符。如果上述任何条件不正确,请使用if else。


在逆转某些代码的过程中(几年前我不记得了),我看到了机器代码之间的单行差异:?如果有的话。Don't remember much but it is clear that implementation of both is different.

但我建议您不要选择其中一个,因为它的效率,根据代码的可读性或您的方便选择。快乐编码


我希望在大多数编译器和目标平台上,"if"更快,而"cases"在哪里?更快。还有一些情况下,一种形式或多或少比另一种形式紧凑。哪种情况有利于一种形式,或者另一种形式在编译器和平台之间会有所不同。如果您在嵌入式micro上编写性能关键的代码,请查看编译器在每种情况下生成的代码,并查看哪种代码更好。在"主流"PC上,由于缓存问题,唯一更好的方法是用类似于真实应用程序的东西对两个表单进行基准测试。


现在我帮不了你了,我也许能帮你解决下面的第二个问题,我想用它吗?如果你只是想知道速度,忽略我的评论。

我能说的是,请你对什么时候使用三元非常聪明?接线员。它既是对可读性的诅咒,也是一种祝福。

在使用前问问自己是否觉得这个更容易阅读

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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%伪造看起来很愚蠢。但是这个小技巧帮助我分析了代码的可读性。这是您在本示例中看到的运算符的可读性,而不是内容。

它看起来很干净,但一般的马桶座和门把手也是如此

在我的经验中,这是有限的,我看到很少有人能够快速地从三元运算符中引渡所需的信息,除非100%确定这更好。我想,当它被窃听的时候,修复它是一种痛苦


三元运算符"?:"可用于构造窗体的条件表达式

1
exp1 ? exp2:exp3

其中exp1、exp2和exp3是表达式

例如

1
2
3
4
5
        a=20;
        b=25;
        x=(a>b)?a:b;

        in the above example x value will be assigned to b;

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

1
2
3
4
            if (a>b)
             x=a;
             else
             x=b;

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


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