三元运算符的优势在于否则?

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

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

替代方案:

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

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

这是在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) 

寄存器偏移量是不同的,但在function上,代码执行相同的操作。 它将两个文字添加到两个不同的寄存器中,然后根据比较结果进行比较和跳转。

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

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

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

唯一的“优势”是你可以在表达式中使用三元运算符(例如函数参数),从而制作更复杂的代码。 使用if ,你会复制完整的表达式。

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

只有在测量到性能问题时才会担心效率问题。

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