【问题标题】:advantage of ternary operator over if else? [duplicate]三元运算符优于 if else 的优势? [复制]
【发布时间】:2013-09-17 00:40:44
【问题描述】:

使用三元运算符是否有任何性能或内存方面的优势而不是 if else(反之亦然)? 比如下面的一个案例:

int x=0, y=1, z=2, a=0;
a= x ? y : z;

替代方案:

if ( x != 0 ){
    a = y;
}else{
    a = z;
}

【问题讨论】:

  • 注意并比较代码长度
  • 很可能没有性能优势,当然也没有内存使用优势。
  • @GrijeshChauhan 为什么代码长度很重要?如果性能相同,那么与人类可读性相比,代码长度并不重要
  • @DavidA.French 三元运算符比 'if' /'else' 简洁得多,并且为了简单的表达,它具有更好的可读性和单行性。可读性高于性能
  • @GrijeshChauhan 可读性是主观的。对于许多人来说,if/else 语句更具可读性。而且你没有根据可读性来表达你的观点。你说的代码长度。代码长度=/=可读性。

标签: c


【解决方案1】:

如果您查看这两种方法的反汇编,它们在我所知道的任何现代编译器上通常都是相同的。三元运算符只是编写相同内容的一种紧凑形式。

这是在 Mac OS X 上使用 gcc 4.2.1 的示例:

使用 if/else:

int x = 1;
int y = 2;
int z;

if (x < y)
{
    z = 3;
}
else
{
    z = 4;
}

使用三元运算符:

int x = 1;
int y = 2;
int z = (x <  y) ? 3 : 4;

如果你在这两个上运行 gcc -S test.c,你会得到这个 if/else 版本的程序集:

    movl    $1, -16(%rbp)
    movl    $2, -20(%rbp)
    movl    -16(%rbp), %eax
    movl    -20(%rbp), %ecx
    cmpl    %ecx, %eax
    jge LBB1_2
    movl    $3, -12(%rbp)
    jmp LBB1_3
LBB1_2:
    movl    $4, -12(%rbp)

这对于三元运算符版本:

    movl    $1, -12(%rbp)
    movl    $2, -16(%rbp)
    movl    -12(%rbp), %eax
    movl    -16(%rbp), %ecx
    cmpl    %ecx, %eax
    jge LBB1_2
    movl    $3, -20(%rbp)
    jmp LBB1_3
LBB1_2:
    movl    $4, -20(%rbp)

寄存器偏移量不同,但在功能上,代码做同样的事情。它将两个字面量添加到两个不同的寄存器中,然后根据比较结果进行比较和跳转。

【讨论】:

  • 当我有一个简单的printf 语句作为 if/else 的内容时,编译器会将其转换为_puts,而在三元组中它使用_printf。知道为什么会有区别吗?我正在使用 gcc 4.5.0。
【解决方案2】:

编译器通常足够聪明,可以将两者优化为相同的指令。最好使用三元运算符而不假设编译器优化。

【讨论】:

    【解决方案3】:

    在任何现代编译器上,这两者之间通常没有区别。

    因此,这只是代码的可读性和可维护性的问题。

    【讨论】:

      【解决方案4】:

      唯一的“优点”是您可以在表达式中使用三元运算符(例如函数参数),从而获得更简洁的代码。使用if,您将复制完整的表达式。

      【讨论】:

        【解决方案5】:

        在您的特定情况下使用最易读的那个。

        只有当你测量出你有性能问题时才担心效率。

        编译器很可能会生成相同的代码。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-06-05
          • 2010-12-12
          • 2021-01-03
          • 1970-01-01
          • 2011-05-10
          • 2021-03-31
          • 2016-09-27
          • 2018-02-22
          相关资源
          最近更新 更多