三元运算符的优势还有其他?

Ang*_*ngs 2 c

使用三元运算符是否存在任何性能或内存明智优势(反之亦然)?例如下面的案例:

int x=0, y=1, z=2, a=0;
a= x ? y : z;
Run Code Online (Sandbox Code Playgroud)

替代方案:

if ( x != 0 ){
    a = y;
}else{
    a = z;
}
Run Code Online (Sandbox Code Playgroud)

Zac*_*ner 5

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

这是在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;
}
Run Code Online (Sandbox Code Playgroud)

使用三元运算符:

int x = 1;
int y = 2;
int z = (x <  y) ? 3 : 4;
Run Code Online (Sandbox Code Playgroud)

如果你在这两个版本上运行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)
Run Code Online (Sandbox Code Playgroud)

这对于三元运算符版本:

    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)
Run Code Online (Sandbox Code Playgroud)

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