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

C++ 基于数字值(正、负、零)实现条件表达式的最佳方法,c++,if-statement,optimization,C++,If Statement,Optimization,是否有更好的优雅方式来实现以下简单代码(diffYear、a和B是数字): diffYear=yearA-yearB; 如果(diffYear==0){ A=B=0; } 否则如果(diffYear>0){ A=年份*-1; B=0; } else如果(diffYear0) A=年份*-1; 否则如果(年份

是否有更好的优雅方式来实现以下简单代码(diffYear、a和B是数字):

diffYear=yearA-yearB;
如果(diffYear==0){
A=B=0;
}
否则如果(diffYear>0){
A=年份*-1;
B=0;
}
else如果(diffYear<0){//显然,人们只能编写一个简单的else,这是为了示例
A=0;
B=一年;
}

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

A=B=0;
diffYear=yearA-yearB;
如果(年份>0)
A=年份*-1;
否则如果(年份<0)
B=一年;

请注意
else如果(yearA
,则只有
else
是错误的,因为我们删除了第一个。

此实现很好

有没有更好的优雅方法来实现下面的简单代码

经验法则是:清楚它在做什么吗?如果是,请留下


其他实现也是可能的,但您必须考虑谁将阅读此代码。例如,在一个团队/组织中,如果大多数开发人员每天都使用数学,我会写下如下内容,让他们觉得更“自然”:

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

什么是“更好”或“更优雅”多少有些主观,伊姆霍。但是,您可以使用(三元):

diffYear=yearA-yearB;
A=(年<0)?0:1年*-1;
B=(年<0)?年份:0;
(请注意,如中所述,当
diffYear==0时,
A
B
都将“自动”设置为零。

可能的解决方案:

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);
模板
标准:对负偏差(T a,T b){
if(a
另一个选项是使用最小值和最大值。我不确定在这种情况下这是否更具可读性,但在某些上下文中确实如此

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

(还请注意,一般来说,我希望在创建变量时对其进行初始化。在原始代码中,您可以将它们初始化为0,并从if块中删除这些行)

因为我们不知道比较中涉及的类型,我更喜欢只使用
如果(diffYear==0)
实际上不需要,因为这两种情况都会产生
A=B=0无论如何。我认为为了可读性,diffYear变量是不必要的
if(yearA>yearB)
在imo中更好。包含此答案的解释将帮助其他用户理解这是如何回答原始问题的。
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);
A = -std::max(diffYear, 0);
B = std::min(diffYear, 0);
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);