"&&"和"||"的区别

6

我不理解在某种情况下 && 和 || 之间的区别。

If(a && b) { then do this }

现在如果a为假,则会查看b,但不会测试条件。
但是...
If(a || b) { then do this }

现在,如果a为真,则不会查看b 并且不会测试条件。

为什么会这样呢?我认为&&和||的目的是帮助加快速度。如果可以通过测试第一个条件来确定结果,则不需要查看第二个条件。但在&&的情况下,它确实会查看它。而在||的情况下则不会。

我理解正确吗? 如果是这样,为什么会这样呢?


4
查看https://dev59.com/82oy5IYBdhLWcg3wHqeB翻译: See https://dev59.com/82oy5IYBdhLWcg3wHqeB - d.moncada
4
现在,如果a为假,则会查看b,但不会测试条件。您是如何确定这是真实的? - mellamokb
请查看重复内容,并阅读关于逻辑合取运算(&&)和逻辑析取运算(||)的真值表(http://en.wikipedia.org/wiki/Truth_table#Logical_conjunction)。 - user44484
5个回答

13

为了理解答案,请回忆一下逻辑运算符 ANDOR 的真值表:

  AND  true   | false
     \--------+-------
true  | true  | false
------+-------+-------
false | false | false


   OR  true   | false
     \--------+-------
true  | true  | true
------+-------+-------
false | true  | false
请注意第二列是 AND,第一列是 OR:它们具有相同的值。这是理解为什么当第一个参数求值为false时,AND会忽略第二个参数的关键:这时第二个参数并不重要(第二列)。相反,对于OR运算符,则恰好相反:现在第一个参数中的false意味着第二个参数很重要。但是,第一个参数中的true(第一列)表示可以忽略第二个参数。

我认为使用&&和||的目的是提高速度。

这只是它们作用的一部分。更大的作用是根据左侧的表达式保护右侧。考虑这样一种情况,您想要防止空字符串和null字符串。如果&&||没有“短路”评估,您将被迫编写如下代码:

if (s == null) return false;
if (s.length() == 0) return false;

你能写作的原因

if (s == null || s.length() == 0) return false;

短路求值:保证在 null 字符串上不会调用 s.length()


5

&&被用于执行and操作,这意味着如果任何一个表达式/条件的结果为false,整个操作都将返回false。

so if any one of the condition becomes false it won't even continue further to check 

|| 用于执行或运算,如果任何一个表达式/条件求值为true,整个表达式都会变成true。

so it continues till the end to check atleast one condition to become true.

2
嗯...请仔细再次阅读他的问题。 - Octoshape
这不是 OP 所询问的内容。 - PM 77-1
我理解这个。但是在&&的情况下,无论第一个条件是真还是假,都会查看第二个条件。为什么? - ragingbull
好的。我的老师误导了我。将条件设置为false,如(a=false),让我认为这个条件是true,因为"a"可以接受false。我是一名学生,我的老师没有接受过大学教育。对不起,这都是一个错误。 - ragingbull
1
@ragingbull:最好的做法可能是删除这个问题,这样就不会导致进一步的混淆了。 - mellamokb

2

&& 是 AND 运算符,而 || 是 OR 运算符。 && 会查找 false,这意味着如果第一个参数为 false,则不会测试第二个参数是 true 还是 false。 || 查找 true,这意味着即使第一个参数为 false,它也会测试第二个参数。如果两个参数都为 false,则结果为 false,否则为 true。在 && 的情况下,如果两个参数都为 true,则结果为 true,否则为 false。


请再次阅读问题。这并不简单。 - PM 77-1

2

a && b如果a为false,那么a和b都不可能为true,所以如果a确实是false,就没有必要检查b。

a || b如果a为true,那么a和b都不可能为false,所以如果a确实是true,就没有必要检查b。

它们被称为短路运算符。

如果您想打败这种行为,请改用&和|。


0

嗯...万一你的疑问是关于&&运算符在左操作数为false时评估右操作数,那么请阅读以下内容:

条件与运算符(Java语言规范)

具体而言,请看第一句话:

条件与运算符&&类似于&(§15.22.2),但仅在其左操作数的值为true时才评估其右操作数。

和最后一句话:

因此,对于布尔操作数,&&计算的结果与&相同。它的不同之处在于右操作数表达式是有条件地而不总是被评估的。


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