在处理布尔值时,使用if语句或方程通常是否更好?请解决以下问题,请记住,您的答案应适用于大多数(如果不是全部)代码:
(我指的是C ++,但由于这个问题是半通用的,因此也会对其他语言的引用或比较表示赞赏。)
鉴于以下广泛的情况,
int n = (anything);
bool x_not_y = (declared as random boolean value);
目标是int x = n
如果x_not_y
为真而int y = n
恰恰相反,那么使用 if / else语句会更好吗:
if (x_not_y)
x = 5;
else
y = 5;
(以下简称)
x_not_y?x = 5:y = 5;
或使用等式?
x = (x * (int)!x_not_y) + (5 * (int)x_not_y);
y = (y * (int)x_not_y) + (5 * (int)!x_not_y);
答案 0 :(得分:7)
哪个更快,为什么?或者差异是否太小而不显着?
我怀疑这样的代码会对现代优化器产生影响,但如果你想知道,我们首先要问,什么平台,什么编译器?,然后我们需要测量。
其中一个是否更具活力?在某些情况下,是否有一个原因可能与另一个相悖?
由于我碰巧相信您的编译器的优化器可以同等地处理所有这些,我建议编写易于理解和维护的代码,并且只有在测量显示这是一个热点之后才能处理优化。
哪个是更好/首选的代码,还是完全基于意见的做法?
随着时间的推移,我发现我越来越倾向于功能范式。我喜欢通过代码的结构更好地表达分支,而不是通过变量值,我更喜欢尽可能多地表达(甚至是语言环境变量)。
我特别学会不喜欢这样的代码:
int x;
if( some_condition )
x = 5;
else
x = 42;
为了理解这样的代码,必须跟踪每个变量的值并遵循每个语句。此外,x
此处不能const
,我认为这是一个字符串劣势。
我非常喜欢
const int x = calc_x(some_condition);
,在这个例子中很简单的情况下,可以写成
const int x = some_condition ? 5 : 42;
现在x
可以是const
(允许编译器阻止我无意中做傻事),实现算法的代码片段找出x
应该是什么一个名称(calc_x()
),而不是算法inline
,现在只有该名称在代码中。
当然,这段代码很简单,它并不真正需要我列出的好处,但是当你处理更复杂的现实代码时,我发现,从长远来看,一个更实用的方法会更好。
答案 1 :(得分:-1)
你的两个例子做了两件事:
IF语句改变x或y,而另一个不变。
你的等式改变了x& y,将1设置为值5
,将另一个设置为0
。
也就是说,if语句可能会遭受分支错误预测惩罚,而第二种形式则不会(以难以阅读为代价)。