使用三元运算符是否存在任何性能或内存明智优势(反之亦然)? 例如下面的案例:
int x=0, y=1, z=2, a=0;
a= x ? y : z;
替代:
if ( x != 0 ){
a = y;
}else{
a = z;
}
答案 0 :(得分: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;
}
使用三元运算符:
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)
寄存器偏移量不同,但在功能上,代码执行相同的操作。它将两个文字添加到两个不同的寄存器中,然后根据比较结果进行比较和跳转。
答案 1 :(得分:3)
编译器通常足够智能,可以将两者优化为相同的指令。最好使用三元运算符而不假设编译器优化。
答案 2 :(得分:2)
在任何现代编译器上,这两者之间通常没有区别。
因此,这只是代码的可读性和可维护性的问题。
答案 3 :(得分:2)
唯一的“优势”是你可以在表达式中使用三元运算符(例如函数参数),从而制作更简洁的代码。使用if
,您将复制完整的表达式。
答案 4 :(得分:1)
在您的特定情况下使用最具可读性的。
只有在测量到性能问题时才会担心效率。
很可能,编译器将生成相同的代码。