实现基于数字值(正、负、零)的条件表达式的最佳方法

Best way to implement conditional expression based on numeral value (positive, negative, zero)

本文关键字:表达式 方法 最佳 条件 于数字 数字 实现      更新时间:2023-10-16

有没有更好的方法来实现朴素的以下代码(diffYear,A和B是数字(:

diffYear = yearA - yearB;
if (diffYear == 0) {
A = B = 0;  
}
else if (diffYear > 0) {
A = diffYear * -1;
B = 0;
}
else if (diffYear < 0) {   // obviously one could only write a simple else, this is for the sake of the example
A = 0;
B = diffYear;
}

这个实现很好。

有没有更好的方法来实现朴素的以下代码

经验法则是:清楚它在做什么吗?如果是,请离开它。


其他实现也是可能的,但您必须考虑谁将阅读此代码。例如,在一个团队/组织中,大多数开发人员每天都使用数学,我会写下面这样的东西,让他们看起来更"自然":

auto neg(int x) { return x < 0 ? x : 0; }
//...
int const A = neg(yearB - yearA);
int const B = neg(yearA - yearB);

可能的解决方案:

template<typename T>
std::pair<T, T> neg_diff(T a, T b) {
if (a < b)
return {0, a - b};
else
return {b - a, 0};
}
const auto [A, B] = neg_diff(yearA, yearB);

正如@Jarod在评论中指出的那样,也许你可以把它写成:

A = B = 0;  
diffYear = yearA - yearB;
if (diffYear > 0)
A = diffYear * -1;
else if (diffYear < 0)
B = diffYear;

请注意else if(yearA < yearB),只是一个else是错误的,因为我们删除了第一个。

恕我直言,什么是"更好"或"更优雅"有些主观。但是,您可以使用(三元(条件运算符减少代码量:

diffYear = yearA - yearB;
A = (diffYear < 0) ? 0 : diffYear * -1;
B = (diffYear < 0) ? diffYear : 0;

(请注意,正如注释中指出的,当diffYear == 0AB都将设置为零时,"自动"(。

另一种选择是使用最小值和最大值。我不确定在这种情况下这是否更具可读性,但在某些情况下

它是。
A = -std::max(diffYear, 0);
B = std::min(diffYear, 0);

(另请注意,一般来说,我希望变量在创建时被启动。在你的原始代码中,你可以将它们初始化为 0,并从 if 块中删除这些行(

由于我们不知道比较中涉及的类型,因此我更喜欢只使用<因为这通常是自定义类中实现的第一个,有时是唯一一个比较运算符。

diffYear = yearA - yearB;
if(diffYear < 0) { // negative diff
A = 0;
B = diffYear;
} else {           // the rest of the diffs
A = -diffYear; // was: A = diffYear * -1
B = 0;                
}
A = min(yearB - yearA, 0);
B = min(yearA - yearB, 0);