实现基于数字值(正、负、零)的条件表达式的最佳方法
Best way to implement conditional expression based on numeral value (positive, negative, zero)
有没有更好的方法来实现朴素的以下代码(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 == 0
A
和B
都将设置为零时,"自动"(。
另一种选择是使用最小值和最大值。我不确定在这种情况下这是否更具可读性,但在某些情况下
它是。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);
相关文章:
- 实现基于数字值(正、负、零)的条件表达式的最佳方法
- 用C++编写正则表达式的正确方法是什么?
- 有没有一种简单的方法来检查C++中的不安全表达式
- C++ 解决方法:"从类型"B*"的表达式初始化类型"C*&"的引用无效"
- 通过调试来检查C 中单行表达式执行顺序的方法
- 有什么方法可以通过删除表达式安全地处理两次释放内存?
- 我如何编写看起来像方法的lambda表达式
- 令牌调用之前'...'预期的主表达式 模板化类的模板化方法
- 是否存在将String转换为可执行的c++表达式的方法
- 如何使用增强正则表达式替换方法
- 在C++中匹配正则表达式的惯用方法
- 必须有一种非常快速的方法来计算此按位表达式
- 在 lambda 表达式中调用方法
- 松弛常量表达式中并集的非活动成员的左值到右值转换的解决方法
- 分配给正则表达式方法的布尔值
- 在类方法上使用指针:表达式的类型必须为bool错误
- OOP中解析S表达式的正确方法
- c++向量排序方法编译失败,返回预期表达式
- 错误:在类方法声明中无效地使用void表达式
- 用于方法链的c++ lambda表达式