可能重复:
What is the diffference between the | and || or operators?
逻辑AND和OR:
(x & y)
(x | y)
条件AND和OR:
(x && y)
(x || y)
到目前为止,我只知道条件操作数。我知道它的作用以及如何在if语句中应用它。但逻辑操作数的目的是什么?
答案 0 :(得分:77)
我更倾向于将其视为“按位与条件”而不是“逻辑与条件”,因为“逻辑”的一般概念适用于这两种情况。
x & y // bitwise AND, 0101 & 0011 = 0001
x | y // bitwise OR, 0101 | 0011 = 0111
x && y // true if both x and y are true
x || y // true if either x or y are true
修改强>
根据大众的需求,我还应该提一下,这些论点的评估方式不同。在条件版本中,如果整个操作的结果可以由第一个参数确定,则不评估第二个参数。这称为短路评估。按位运算必须评估双方以计算最终值。
例如:
x.foo() && y.bar()
如果y.bar()
评估为x.foo()
,则只会调用true
。相反,
x.foo() || y.bar()
如果y.bar()
评估为x.foo()
,只会致电false
。
答案 1 :(得分:33)
(x && y)
懒惰。如果x为真,它只会评估y。
(x & y)
不是懒惰。 y将永远被评估。
答案 2 :(得分:11)
更新后的答案 - 我的原文具有误导性和不完整性。
首先,我应该就此问题的大部分评论和回答道歉。
在阅读规范之后,按位运算符和条件运算符之间的区别就不那么明确了。
根据14.10 of ECMA-334部分:
&,^和|运营商被称为 逻辑运算符。
表示整数运算:
1&运算符按位计算 两个操作数的逻辑AND,| 运算符计算按位逻辑 两个操作数的OR,和^ 运算符计算按位逻辑 两个操作数的异或。 2号 从这些溢出是可能的 操作
根据14.11:部分
&&和||运营商被称为 条件逻辑运算符。 2他们 也被称为“短路” 逻辑运算符。
14.11.1
1当&&的操作数时或||是的 键入bool,或者当操作数是 没有定义适用的类型 运营商&或者运营商|,但是 将隐式转换定义为bool, 操作处理如下: 2操作x&& y被评估为 X ? y:假。换句话说,x是 首先评估并转换为类型 布尔。 4然后,如果x为真,则y为 评估并转换为bool类型, 这成为了结果 操作。 5否则,结果 操作是错误的。 6 操作x || y被评估为x? 是的:是的。 7换句话说,x是第一个 评估并转换为bool类型。 8然后,如果x为真,则结果为 操作是真的。 9否则,y 被评估并转换为类型 布尔,这成为了结果 操作。
14.11.2
1当&&的操作数时或||是的 声明适用的类型 用户定义的运算符&或运算符|, 必须满足以下两个条件, 其中T是其中的类型 声明了选定的运算符:2 返回类型和每个类型 所选运算符的参数 必须是T. 3换句话说, 运算符必须计算逻辑AND 或两个操作数的逻辑或 键入T,并且必须返回结果 类型T. 4 T必须包含声明 运算符true和运算符false。 第2段1编译时错误 如果这些要求中的任何一个发生 不满意。 2否则,&& 或||操作评估 结合用户定义的运算符 true或运算符false 选定的用户定义运算符:3 操作x&& y被评估为 T.false(x)? x:T。&(x,y),其中 T.false(x)是对。的调用 在T中声明的运算符false,和 T.&(x,y)是对...的调用 选定的运营商&amp ;. 4换句话说, 首先评估x和运算符 在结果上调用false 确定x是否肯定是假的。五 然后,如果x肯定是假的,那么 操作的结果是值 以前为x计算过。 6 否则,y被评估,并且 选定的运营商&被调用 先前为x和x计算的值 为y生成的计算值 操作的结果。 7 操作x || y被评估为 T.true(x)? x:T。|(x,y),其中 T.true(x)是一个调用 operator在T中声明为true,和 T. |(x,y)是对的调用 选定的运算符|。 8换句话说, 首先评估x并使operator为true 在结果上调用以确定 如果x绝对是真的。 9然后,如果是x 绝对是真的,结果 操作是先前的值 为x计算。 10否则,y是 评估,并选择运算符| 在之前的值上调用 计算x和计算的值 为了产生结果 操作。第3段1在任何一个中 这些操作,给出的表达方式 by x只评估一次,而且 由y给出的表达式要么不是 评估或评估一次。 第4段1对于一个类型的例子 实现operator true和 运算符false,参见§18.4.2。