逻辑与条件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