我一直想知道这一点。假设我们有一个变量字符串权重和一个输入变量 int 模式,它可以是 1 或 0。
使用是否有明显的好处:
weight = (mode == 1) ? "mode:1" : "mode:0";
超过
if(mode == 1)
weight = "mode:1";
else
weight = "mode:0";
超出代码可读性?速度是否受到影响,编译器是否以不同的方式处理(例如某些 switch 语句转换为跳转表的能力)?
我一直想知道这一点。假设我们有一个变量字符串权重和一个输入变量 int 模式,它可以是 1 或 0。
使用是否有明显的好处:
weight = (mode == 1) ? "mode:1" : "mode:0";
超过
if(mode == 1)
weight = "mode:1";
else
weight = "mode:0";
超出代码可读性?速度是否受到影响,编译器是否以不同的方式处理(例如某些 switch 语句转换为跳转表的能力)?
条件运算符和 if/else 块之间的主要区别在于条件运算符是表达式,而不是语句。因此,很少有地方可以使用条件运算符而不能使用 if/else。例如,常量对象的初始化,像这样:
const double biasFactor = (x < 5) ? 2.5 : 6.432;
如果在这种情况下使用 if/else,biasFactor
则必须是非常量。
此外,构造函数初始化器列表也调用表达式而不是语句:
X::X()
: myData(x > 5 ? 0xCAFEBABE : OxDEADBEEF)
{
}
在这种情况下,myData 可能没有定义任何赋值运算符或非常量成员函数——它的构造函数可能是向它传递任何参数的唯一方法。
另外,请注意,任何表达式都可以通过在末尾添加分号来转换为语句——反之则不然。
使用mingw,生成的汇编代码
const char * testFunc()
{
int mode=1;
const char * weight = (mode == 1)? "mode:1" : "mode:0";
return weight;
}
是:
testFunc():
0040138c: push %ebp
0040138d: mov %esp,%ebp
0040138f: sub $0x10,%esp
10 int mode=1;
00401392: movl $0x1,-0x4(%ebp)
11 const char * weight = (mode == 1)? "mode:1" : "mode:0";
00401399: cmpl $0x1,-0x4(%ebp)
0040139d: jne 0x4013a6 <testFunc()+26>
0040139f: mov $0x403064,%eax
004013a4: jmp 0x4013ab <testFunc()+31>
004013a6: mov $0x40306b,%eax
004013ab: mov %eax,-0x8(%ebp)
12 return weight;
004013ae: mov -0x8(%ebp),%eax
13 }
与
const char * testFunc()
{
const char * weight;
int mode=1;
if(mode == 1)
weight = "mode:1";
else
weight = "mode:0";
return weight;
}
是:
testFunc():
0040138c: push %ebp
0040138d: mov %esp,%ebp
0040138f: sub $0x10,%esp
11 int mode=1;
00401392: movl $0x1,-0x8(%ebp)
12 if(mode == 1)
00401399: cmpl $0x1,-0x8(%ebp)
0040139d: jne 0x4013a8 <testFunc()+28>
13 weight = "mode:1";
0040139f: movl $0x403064,-0x4(%ebp)
004013a6: jmp 0x4013af <testFunc()+35>
15 weight = "mode:0";
004013a8: movl $0x40306b,-0x4(%ebp)
17 return weight;
004013af: mov -0x4(%ebp),%eax
18 }
生成几乎相同的代码。您的应用程序的性能不应依赖于这样的小细节。
所以,不,这没有什么区别。
不,这纯粹是为了将代码呈现给人类读者。我希望任何编译器都能为这些生成相同的代码。