8

假设我有一个IF条件:

if (A || B) 
    ∧
    |
    |
   left
{ 
   // do something  
}

现在假设它A更有可能收到一个真实的价值B,那么我为什么要关心左边的哪一个呢?

如果我将它们都放在IF括号中,那么我知道(作为代码的程序员)需要双方。

问题是,我的教授在他的讲义上写道,我应该把“更可能的变量接受一个真实的”放在左边。

有人可以解释一下好处吗?好吧,我把它放在左边……我得到了什么?运行 ?

4

9 回答 9

25

它不仅仅是选择左边最可能的条件。您还可以在左侧设置安全卫士,这意味着您只能下一个订单。考虑

if (s == null || s.length() == 0) // if the String is null or empty.

您不能在此处交换顺序,因为第一个条件可以保护第二个条件免于抛出 NPE。

同样,您可以拥有

if (s != null && s.length() > 0) // if the String is not empty

选择最可能为真||或假的&&原因是微优化,以避免在第二个表达式中进行评估的成本。这是否会转化为可衡量的性能差异是值得商榷的。

于 2012-08-25T07:56:15.653 回答
9

我把它放在左边......我得到了什么?运行时间

因为||C++ 中的运算符使用短路求值
ie:B仅当A被评估为 a时才被评估false

但是,请注意,在 C++ 中,保证“内置”数据类型而不是自定义数据类型的短路评估。

于 2012-08-25T04:52:28.963 回答
5

根据javadoc

&& 和 || 运算符对两个布尔表达式执行条件与和条件或运算。这些运算符表现出“短路”行为,这意味着仅在需要时才评估第二个操作数

因此,如果真正的语句在顺序中排在第一位,它会在运行时将第二个操作数短路。

于 2012-08-25T04:51:33.683 回答
2

如果左边的表达式为真,则不需要计算右边的表达式,因此可以在运行时对其进行优化。这是一种称为短路的技术。因此,通过将表达式更可能为真放置在左侧,我们可以期望我们的程序执行得更好,而不是相反。

于 2012-08-25T04:51:36.677 回答
2

您应该首先放置更有可能为真的条件,因为这会导致 if 语句短路。这意味着它不会评估 if 语句的其余部分,因为它已经知道答案是正确的。这使代码更有效率。

当您的 if 语句评估昂贵的东西时,这尤其有用:

if(doExpensiveCheck1() || doExpensiveCheck2()) { }

在这种情况下,由于支票价格昂贵,首先放置最有可能的支票对您有利。

于 2012-08-25T04:51:51.187 回答
2

在许多情况下,除了微小的性能改进外,没有任何实际区别。如果您的检查是非常昂贵的函数调用(不太可能),或者您需要按顺序检查,这变得有用。例如,假设您想检查某物的属性并首先检查某物是否为 nil,您可能会执行以下操作:

如果 (a != nil && a.attribute == 有效) {}

于 2012-08-25T05:05:08.707 回答
0

是的,您正在获得运行时间,对于一次操作来说似乎并不多,但您必须记住,操作将重复数百万次

为什么要在一个足够的情况下执行两个评估是逻辑

于 2012-08-25T05:52:22.130 回答
0

在运行时 if(a||b) 将首先测试 a,如果 a 为真,则不会浪费时间测试 b,因此编译器将提前执行​​ 1 次。因此,如果 a 比 b 更可能为真,则此测试也可能削减 1 条线。单行上未执行的总行数很小,但如果语句嵌套在某种循环中(for、while、recession 或与数据库相关的查询),则它是巨大的。例如,我们有 100 万分钟来测试数据库中的数据,每条记录 1 分钟(条件 A 为 30 秒,条件 B 为 30 秒)。假设 A 有 80% 的机会是真的,B 有 20% 的机会是真的。如果你先放 A 所需的总时间是 600-000 小时,但如果你先放 B 则需要 900-000 小时。如果先测试 A [(0,8*1 百万小时)*0,5 分钟+(0,2*1 百万小时) *1min]===6000-000hrs : 如果 B 先测试 [(0,2*1million hours)*0,5mins+(0, 2*100 万小时)*1 分钟]===9000-000 小时。但是,如果 A 变为真的概率更接近 B 的概率,您会注意到差异不那么显着。

于 2018-04-03T06:39:36.180 回答
0
public class Main
{
    public static void main(String[] args) {
        System.out.println("Hello World");
        Integer a = null;
        Integer b = 3;
        Integer c = 5;

        if(a != null && a == 2){
            System.out.println("both");
        }else{
            System.out.println("false");
        }
    }
}

你好世界

于 2020-04-15T22:17:59.603 回答