逻辑与条件and或C#中的and之间有什么区别?

逻辑与条件and或C#中的and之间有什么区别?,c#,conditional-operator,logical-operators,C#,Conditional Operator,Logical Operators,可能重复: 逻辑与或: (x & y) (x | y) (x && y) (x || y) 有条件的和或: (x & y) (x | y) (x && y) (x || y) 到目前为止,我只知道条件操作数。我知道它的作用以及如何在if语句中应用它。但逻辑操作数的用途是什么 (x && y) 他很懒。只有当x为真时,它才会计算y (x & y) 他并不懒惰。将始终对y进行评估。更新答案-我的原始答案具有误导性

可能重复:

逻辑与或:

(x & y)
(x | y)
(x && y)
(x || y)
有条件的和或:

(x & y)
(x | y)
(x && y)
(x || y)
到目前为止,我只知道条件操作数。我知道它的作用以及如何在if语句中应用它。但逻辑操作数的用途是什么

(x && y) 
他很懒。只有当x为真时,它才会计算y

(x & y)

他并不懒惰。将始终对y进行评估。

更新答案-我的原始答案具有误导性且不完整

首先,我要为我对这个问题的评论和回答道歉

阅读规范后,按位运算符和条件运算符之间的区别就不那么清晰了

根据第节:

&、^和|运算符被称为 逻辑运算符

对于整数运算:

1运算符按位计算值 两个操作数中的逻辑AND| 运算符计算按位逻辑值 两个操作数的或,以及^ 运算符计算按位逻辑值 两个操作数的异或。2号 这些设备可能会出现溢流 行动

根据章节

&&和| |运算符称为 条件逻辑运算符。2他们 也被称为“短路” 逻辑运算符

14.11.1

当&&或| |的操作数为 输入bool,或当操作数为 未定义适用类型的类型 运算符&或运算符|,但不要 定义到bool的隐式转换, 操作处理如下: 2操作x和y的计算结果为 x?y:错。换句话说,x是 首先计算并转换为类型 布尔。4那么,如果x为真,y为 计算并转换为bool类型, 这就成为了 活动5否则,结果为: 操作是错误的。6 操作x | | y的计算结果为x? 真的:y。换句话说,x是第一个 计算并转换为bool类型。 8然后,如果x为真,则 手术是真的。9否则,y 计算并转换为类型 bool,这就是 手术

14.11.2

当&&或| |的操作数为 声明适用的 用户定义的运算符&或运算符|, 以下两项都必须是正确的, 其中T是 已声明所选运算符:2 返回类型和每个 所选运算符的参数 必须是T.3,换句话说 运算符必须计算逻辑AND 或的两个操作数的逻辑或 输入T,并且必须返回 类型T.4T必须包含声明 运算符true和运算符false的值。 第2.1段编译时错误 如果满足以下任一要求,则发生 他不满意。2否则&& 或| |操作由 组合用户定义的运算符 使用 所选自定义操作员: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和x计算的值 为y计算的要生成的值 手术的结果。7 操作x | | y评估为 真的(x)?x:T.|(x,y),其中 T.true(x)是对 运算符true在T中声明,并且 T.|(x,y)是对 所选运算符|。8换言之, 首先计算x,运算符为true 对结果调用以确定 如果x肯定是真的。9那么,如果x 这绝对是真的,结果是 操作是以前的值 计算x。10否则,y为 已计算,并且选定了运算符| 在以前的值上调用 计算x和计算的值 对于y,生成 活动第3.1款 这些操作,表达式 只对x求值一次,并且 y给出的表达式不是 评估过的或只评估过一次的。 第4.1段中的类型示例 实现运算符true和 操作员错误,见§18.4.2


我更喜欢将其视为“按位vs.条件”而不是“逻辑vs.条件”,因为“逻辑”的一般概念适用于这两种情况

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,这绝对正确。在对布尔人进行操作时,唯一的区别是“懒惰”。实际上,无论是对布尔型还是更大的整数类型进行操作,操作都没有什么不同。它是在两个单个位上按位进行运算,然后返回一个位。@John,这是完全正确的。根据第7.10.3节布尔逻辑运算符中的C#规范:“如果x或y为真,则x | y的结果为真。否则,结果为假。”另请参见第7.11节条件逻辑运算符:“运算x | y对应于运算x | y,除非仅当x为fal时才计算y