一个or语句的优先级是否重要?

3
假设我有这段代码:
age = 21;
allowedFromParents = false;
if (age >= 18 || allowedFromParents == true)
{
    //go drink
}

当我调试这段代码时,如果第一个条件为真,它就会直接进入语句,而不再检查其他条件。

现在,这只是一个简单的条件语句,但如果条件语句很复杂,在一个频繁的循环中计算,并且一个条件比另一个更有可能为真,那么条件语句的顺序是否会影响性能呢?


6
短路求值(Short-circuit evaluation)是一种逻辑运算的优化技巧,当计算一个条件表达式时,如果左侧已经能确定整个表达式的结果,则不再对右侧进行计算,直接返回结果。这种方法可以提高程序执行效率,并且常用于处理复杂的布尔逻辑表达式。 - Damien_The_Unbeliever
1
你是出于纯粹的知识好奇还是真的在 OR 运算中遇到了性能问题?显然,如果第一个条件比后面的更经常返回 true,那么你将获得更好的性能,但这更取决于你在这些条件评估中做了什么。 - Steve
相关:https://dev59.com/AXVD5IYBdhLWcg3wQZYg - Drag and Drop
@Steve 多半是出于知识的考虑。我几乎可以确定它会影响性能,但我很好奇是否有更好的解释来说明我所思考的问题。 - Steven
最近我发现,除了性能之外,你还可以改变语句的优先级来实现许多其他用途,比如缩短单个if语句。例如,在一个语句中检查类是否为null,然后立即检查类内的值也是可能的。随着学习,更好地理解代码的逻辑是很好的事情。 - Steven
4个回答

4

是的,这很重要。如果第一个条件为真,则停止评估其余条件。换句话说,右侧的条件可能不会被评估。

逻辑或运算符(||)返回布尔值true,如果其中一个或两个操作数为true,则返回false。在评估之前,操作数会被隐式转换为bool类型,并且结果是bool类型。逻辑或具有从左到右的结合性。

https://msdn.microsoft.com/fi-fi/library/f355wky8(v=vs.120).aspx


4
你所看到的是短路求值。正如你所猜测的,条件语句的顺序可能会影响性能:如果其中一个计算量很大并且在紧密循环中完成,你可以考虑先放置另一个条件语句。然而,“过早优化是万恶之源--DonaldKnuth”,这意味着除非你已经在这段代码中测量出了性能瓶颈,否则你应该以可读性为重点编写它,而不是性能。

1
将需要执行更长时间的条件放在右边,这样如果左边的条件评估为true,则不会检查第二个条件。
是的,如果您处于一个紧密循环中,最坏情况下会迭代一千次,那么它肯定会提高性能。

0

是的,这些语句的优先级很重要,但不仅仅是关于性能的问题。
在某些情况下,它可以用来缩短多个if语句。

例如:

if (patient == null || patient.age == 0)
{
    //patient is invalid
}

我曾经认为这只能与and语句很好地配合使用,但在这种情况下,除非患者不为空,否则它不会到达第二个语句。这使得代码更具可读性、性能更高,并且在我的情况下,更安全,可以避免崩溃。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接