Performance IF/ELSE语句顺序的最佳实践(不允许出现一种情况)

Performance IF/ELSE语句顺序的最佳实践(不允许出现一种情况),performance,if-statement,Performance,If Statement,在一个简单的if-else情况下(需要为每个条目检查分数分母的零值),语句的正确排列是否存在 例如: if (!(denominator == 0)) { quotient = numerator / denominator; System.out.println(numerator + " / " + denominator + " = " + quotient); } else { System.out.

在一个简单的if-else情况下(需要为每个条目检查分数分母的零值),语句的正确排列是否存在

例如:

    if (!(denominator == 0))
    {
        quotient = numerator / denominator;
        System.out.println(numerator + " / " + denominator + " = " + quotient);
    }
    else
    {
        System.out.println("Division by zero is not allowed.");
    }

我知道这是一个微不足道的例子,但我很好奇,考虑if-else语句的顺序是否有任何好处(在上述情况下)。对于不那么琐碎的输入/值测试,我可以理解这里提出的一致答案:

如果这是一个糟糕的问题(或者应该有明确答案的问题),请提前道歉。我的目的是提高编码的总体效率。尽管如此,我怀疑我所举的两个例子之间是否有任何重大差异。我的新手分析表明,分母将被测试为零,因此否定了测试“正常情况”的任何好处。如果我错了,请纠正/启发我


TIA

史蒂夫·麦康奈尔(Steve McConnell)对代码完整性有一些建议。他建议首先出现if语句的非异常或最常用分支。(您的第一个代码示例。)


关于性能,应该没有区别。

Steve McConnell对代码完整性有一些建议。他建议首先出现if语句的非异常或最常用分支。(您的第一个代码示例。)


至于性能,应该没有区别。

最后,编译器的工作是订购此类产品以获得最大性能。当涉及到如此琐碎的细节时,您最关心的应该是简单易读的代码。因此,第二个示例将得到我的投票,因为它(稍微)少了一些。

最后,编译器的工作是为了获得最大的性能而订购这类东西。当涉及到如此琐碎的细节时,您最关心的应该是简单易读的代码。因此,第二个例子会得到我的投票,因为它(稍微)少了一点。

这里的另一个答案提到了《代码完成》(一本好书)作为第一个最普通案例的例子。我完全同意这一点。然而,由于你的行为不是“如果(正常)服用某种药物(否则罕见的情况下)服用某种药物”,我认为这不适用。Insted McConnell提前退出的建议似乎是恰当的:

/* Probably should be throw new Exception(".."); */
if (denominator == 0) 
    return "Division by zero is not allowed."; 


quotient = numerator / denominator; 
return(numerator + " / " + denominator + " = " + quotient);

这里的另一个答案提到了CodeComplete(一本很棒的书),作为先处理最正常情况的示例。我完全同意这一点。然而,由于你的行为不是“如果(正常)服用某种药物(否则罕见的情况下)服用某种药物”,我认为这不适用。Insted McConnell提前退出的建议似乎是恰当的:

/* Probably should be throw new Exception(".."); */
if (denominator == 0) 
    return "Division by zero is not allowed."; 


quotient = numerator / denominator; 
return(numerator + " / " + denominator + " = " + quotient);

非常感谢。我也这么怀疑(第一个示例/没有性能差异)。我需要一份完整的代码副本。最近我似乎多次提到它(因为我倾向于提出很多“技术”问题)。此外,我问这个问题是因为第一个代码示例是我为家庭作业问题提供的答案。但是,一个后续问题的措辞似乎是这样的,似乎第二个例子是预期中的。我觉得第一种情况更为正确,但我正在学习Java(自学了C语言,之前只接受过正式的C语言培训)。谢谢你的精神检查,谢谢。我也这么怀疑(第一个示例/没有性能差异)。我需要一份完整的代码副本。最近我似乎多次提到它(因为我倾向于提出很多“技术”问题)。此外,我问这个问题是因为第一个代码示例是我为家庭作业问题提供的答案。但是,一个后续问题的措辞似乎是这样的,似乎第二个例子是预期中的。我觉得第一种情况更为正确,但我正在学习Java(自学了C语言,之前只接受过正式的C语言培训)。谢谢你的理智检查。谢谢你的这句话:“简单易读的代码。”我确实试过。。。在我学习本课程的过程中,我会记住这一点。正如我在上面的评论中所说的那样,您可能会发现我怀疑示例二是首选的,但我选择提交第一个示例,因为我觉得它“更自然”。只有在得到下一个作业后,我才对我的原始代码提出质疑(因为我被要求以一种不可能使用上面第一块代码的方式重新使用我第一次提交的代码)。谢谢你:“简单易读的代码”。我确实尝试过。。。在我学习本课程的过程中,我会记住这一点。正如我在上面的评论中所说的那样,您可能会发现我怀疑示例二是首选的,但我选择提交第一个示例,因为我觉得它“更自然”。只有在获得下一个作业后,我才质疑我的原始代码(因为我被要求以不可能使用上面第一块代码的方式重新使用我第一次提交的代码)。是的,我非常肯定地同意在这里抛出代码。或者至少重新投掷。但是,我们在这个过程中还没有走得很远。如果给我一个程序,让它运行起来,我肯定会这么做的。。。那么,代码上的+1完成了吗?我碰巧知道本地副本在哪里。现在,我必须说服妻子这是必要的;-)另外,我倾向于推广你的答案。特别是当你提到“提前退出”时,我确信这是一个最佳实践。然而,(严格地说是迂腐的)我的问题是关于ex1或ex2的。虽然我同意你的前任(ex3?)更正确,但在这一点上,这对我来说不是一个可行的选择。但是,我非常感谢你的详尽回答。很高兴看到你正在考虑这些事情,而且代码中肯定有+1。我甚至可以重读一遍。程序员修炼之道