C# 中的逻辑和条件 AND、OR 有啥区别? [复制]
Posted
技术标签:
【中文标题】C# 中的逻辑和条件 AND、OR 有啥区别? [复制]【英文标题】:What is the difference between logical and conditional AND, OR in C#? [duplicate]C# 中的逻辑和条件 AND、OR 有什么区别? [复制] 【发布时间】:2011-03-10 09:48:01 【问题描述】:可能重复:What is the diffference between the | and || or operators?
逻辑与和或:
(x & y)
(x | y)
条件 AND 和 OR:
(x && y)
(x || y)
到目前为止,我只知道条件操作数。我知道它的作用以及如何在 if 语句中应用它。但是逻辑操作数的目的是什么?
【问题讨论】:
【参考方案1】:我更愿意将其视为“按位与条件”而不是“逻辑与条件”,因为“逻辑”的一般概念适用于这两种情况。
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()
如果x.foo()
的计算结果为true
,这只会调用y.bar()
。反之,
x.foo() || y.bar()
仅当x.foo()
计算结果为false
时才会调用y.bar()
。
【讨论】:
惰性求值是逻辑运算的子集运算方式。应该提到,但与问题无关。 @John Weldon:问题是关于运营商之间的差异。懒惰肯定是其中之一。 @0xA3,“短路”的概念是特定于逻辑操作的。它实际上并不适用于按位运算,除非在某些情况下。 请注意 - 逻辑 vs 条件是微软对它们的命名定义msdn.microsoft.com/en-us/library/6a71f45d%28v=vs.80%29.aspx 当这个答案被用于另一个问题以“证明”&
是按位布尔运算符时,我来到了这里。没有一般的答案,你的开场白完全是错误的。【参考方案2】:
(x && y)
很懒惰。它只会在 x 为真时评估 y。
(x & y)
并不懒惰。 y 将始终被评估。
【讨论】:
这只是故事的一半,可以说是不太重要的一半。 @John,绝对正确。对布尔值进行操作时,唯一的区别是“懒惰”。实际上,无论是对布尔值还是更大的整数类型进行操作,操作都没有什么不同。它在两个单个位上按位执行并返回一点。 @John 这是完全正确的。来自第 7.10.3 节布尔逻辑运算符中的 C# 规范:“如果 x 或 y 为真,则 x | y 的结果为真。否则,结果为假。”另请参阅第 7.11 节条件逻辑运算符:“操作 x || y 对应于操作 x | y,但仅当 x 为假时才评估 y。” . @Robert,我承认该引用与 booleans 相关。你肯定同意这个问题比这更广泛吗? 嗯。我想我会去回答一些其他问题。【参考方案3】:更新答案 - 我的原件具有误导性且不完整。
首先,我应该为我的大部分 cmets 和对这个问题的回答道歉。
阅读规范后,按位运算符和条件运算符之间的区别就不那么明确了。
根据14.10 of ECMA-334部分:
&、^ 和 |运算符被称为 逻辑运算符。
对于整数运算:
1 & 运算符按位计算 两个操作数的逻辑与,| 运算符计算按位逻辑 两个操作数的 OR 和 ^ 运算符计算按位逻辑 两个操作数的异或。 2 否 溢出是可能的 操作。
根据14.11:部分
&& 和 ||运算符被称为 条件逻辑运算符。 2 他们 也称为“短路” 逻辑运算符。
14.11.1
1 当 && 或 || 的操作数属于 类型 bool,或者当操作数是 未定义适用的类型 运算符 & 或运算符 |,但做 定义到布尔的隐式转换, 操作处理如下: 2 操作 x && y 被评估为 X ?是:错误。 3 换句话说,x 是 首先评估并转换为类型 布尔。 4 那么,如果 x 为真,则 y 为 评估并转换为 bool 类型, 这成为了 手术。 5 否则,结果 操作是假的。 6 操作 x || y 被评估为 x ? 真的:是的。 7 换句话说,x 是第一个 评估并转换为 bool 类型。 8 那么,如果 x 为真,则 操作是真的。 9 否则,是 被评估并转换为类型 布尔值,这成为 操作。
14.11.2
1 当 && 或 || 的操作数属于 声明适用的类型 用户自定义运算符 & 或运算符 |, 以下两项必须为真, 其中 T 是其中的类型 选定的运算符被声明:2 返回类型和每个的类型 所选运算符的参数 必须是 T。 3 换句话说, 运算符必须计算逻辑 AND 或两个操作数的逻辑或 类型 T,并且必须返回结果 type T. 4 T 必须包含声明 运算符为真和运算符为假。 第 2 段 1 编译时错误 如果出现这些要求中的任何一个 不满意。 2 否则,&& 或 ||操作由评估 组合用户定义的运算符 true 或 operator false 与 选定的用户自定义算子:3 操作 x && y 被评估为 T.假(x)? x : T.&(x, y),其中 T.false(x) 是对 在 T 中声明的运算符 false 和 T.&(x, y) 是对 选定的运算符 &。 4 换句话说, x 首先被评估和操作符 对结果调用 false 以 确定 x 是否肯定为假。 5 那么,如果 x 肯定为假,则 操作的结果是值 先前为 x 计算的。 6 否则,评估 y,并且 选定的运算符 & 在 先前为 x 计算的值和 为 y 计算的值以产生 操作的结果。 7 操作 x || y 被评估为 T.true(x) ? x : T.|(x, y),其中 T.true(x) 是对 在 T 中声明的运算符 true 和 T.|(x, y) 是对 选定的运算符 |。 8 换句话说, x 首先被评估并且操作符为真 在结果上调用以确定 如果 x 绝对正确。 9 那么,如果 x 绝对是真的,结果 operation 是之前的值 为 x 计算。 10 否则,y 是 评估,并选择运算符 | 在先前的值上调用 为 x 计算和计算的值 对于 y 产生的结果 手术。第 3 段 1 在任何一个 这些操作,给出的表达式 by x 只计算一次,并且 y 给出的表达式要么不是 评估或仅评估一次。 第 4 段 1 类型示例 实现运算符 true 和 运算符 false,请参阅 §18.4.2。
【讨论】:
&
、|
和 ^
过载。对于两个布尔值,它们只是急切(非条件)逻辑运算符(ECMA-364 §14.10.3)
@Matthew,这个问题的提出比布尔值更广泛。
其实我觉得我不同意。从第二个示例中可以清楚地看出 x 和 y 是布尔值。位运算符永远不会进入问题。
@Matthew;同意,可以这样解释。以上是关于C# 中的逻辑和条件 AND、OR 有啥区别? [复制]的主要内容,如果未能解决你的问题,请参考以下文章