逻辑和条件AND之间的区别是什么,在C#中是OR?

Sah*_*bov 47 c# conditional-operator logical-operators

可能重复:
|之间的差异是什么 和|| 还是运营商?

逻辑AND和OR:

(x & y)
(x | y)
Run Code Online (Sandbox Code Playgroud)

条件AND和OR:

(x && y)
(x || y)
Run Code Online (Sandbox Code Playgroud)

到目前为止,我只知道条件操作数.我知道它的作用以及如何在if语句中应用它.但逻辑操作数的目的是什么?

Cog*_*eel 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
Run Code Online (Sandbox Code Playgroud)

编辑

根据大众需求,我还应该提到的是,论证的评估方式不同.在条件版本中,如果整个操作的结果可以由第一个参数确定,则不评估第二个参数.这称为短路评估.按位运算必须评估双方以计算最终值.

例如:

x.foo() && y.bar()
Run Code Online (Sandbox Code Playgroud)

这只会y.bar()x.foo()评估时调用true.反过来,

x.foo() || y.bar()
Run Code Online (Sandbox Code Playgroud)

只会y.bar()x.foo()评估时调用false.

  • 好.懒惰的评价怎么样?你要提那个吗?因为如果你这样做,我可以删除我最不受欢迎的答案. (11认同)

Rob*_*vey 34

(x && y) 
Run Code Online (Sandbox Code Playgroud)

很懒.如果x为真,它只会评估y.

(x & y)
Run Code Online (Sandbox Code Playgroud)

不是懒惰.y将始终被评估.

  • 这只是故事的一半,可以说是不太重要的一半. (16认同)
  • 咩.我想我会回答其他一些问题. (5认同)
  • @John,这是绝对正确的.在布尔运行时,唯一的区别是"懒惰".无论是在布尔运算还是更大的整数类型上运行,操作都是有效的.它正在对两个单位进行逐位处理并返回一位. (3认同)
  • @John这是平坦的.来自7.10.3节中的C#规范布尔逻辑运算符:"如果x或y为真,则x | y的结果为真.否则,结果为false." 另请参见第7.11节条件逻辑运算符:"操作x || y对应于操作x | y,但只有当x为false时才计算y." . (3认同)
  • @Robert,我承认与*布尔*有关的引用.当然你同意这个问题比这更广泛吗? (3认同)
  • @John:的确,我觉得这篇文章缺乏,只能回答一半的问题.我对接受的答案也有同感. (2认同)

Joh*_*don 11

更新的答案 - 我原来的误导和不完整.

首先,我应该为我的大部分评论和对这个问题的回答道歉.

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

根据ECMA-33414.10节:

&,^和| 运算符称为逻辑运算符.

对于整数运算:

1&运算符计算两个操作数的按位逻辑AND,| 运算符计算两个操作数的按位逻辑OR,^运算符计算两个操作数的按位逻辑异或.2这些操作不会溢出.

根据第14.11:

&&和|| 运算符称为条件逻辑运算符.2它们也被称为"短路"逻辑运算符.

14.11.1

1当&&或||的操作数时 是bool类型,或者当操作数是没有定义适用的运算符和/或运算符的类型时,但是确定将隐式转换定义为bool时,操作按如下方式处理:2操作x && y被计算为x?y:假.3换句话说,首先评估x并将其转换为bool类型.4然后,如果x为真,则评估y并将其转换为bool类型,这将成为操作的结果.5否则,操作结果为false.6操作x || y被评估为x?是的:是的.7换句话说,首先评估x并将其转换为bool类型.8然后,如果x为真,则操作结果为真.9否则,y被计算并转换为bool类型,这将成为操作的结果.

14.11.2

1当&&或||的操作数时 声明适用的用户定义的运算符和/或运算符|的类型必须为true,其中T是声明所选运算符的类型:2返回类型和所选参数的每个参数的类型运算符必须为T. 3换句话说,运算符必须计算T类型的两个操作数的逻辑AND或逻辑OR,并且必须返回类型T的结果.4 T必须包含operator true和operator false的声明.第2段1如果不满足这些要求中的任何一个,则会发生编译时错误.2否则,&&或|| 通过将用户定义的运算符true或运算符false与选定的用户定义运算符组合来评估运算:3运算x && y被评估为T.false(x)?x:T.&(x,y),其中T.false(x)是在T中声明的运算符false的调用,并且T.&(x,y)是所选运算符&的调用.4换句话说,首先计算x,并在结果上调用operator false以确定x是否肯定为false.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并在结果上调用operator true以确定x是否确定为真.9然后,如果x绝对为真,则操作的结果是先前为x计算的值.10否则,将评估y,并选择运算符| 在先前为x计算的值和为y计算的值上调用,以生成操作的结果.第3段1在这些操作中的任何一个中,x给出的表达式仅被评估一次,而y给出的表达式未被评估或仅评估一次.第4段1有关实现operator true和operator false的类型的示例,请参见§18.4.2.操作的结果是先前为x计算的值.10否则,将评估y,并选择运算符| 在先前为x计算的值和为y计算的值上调用,以生成操作的结果.第3段1在这些操作中的任何一个中,x给出的表达式仅被评估一次,而y给出的表达式未被评估或仅评估一次.第4段1有关实现operator true和operator false的类型的示例,请参见§18.4.2.操作的结果是先前为x计算的值.10否则,将评估y,并选择运算符| 在先前为x计算的值和为y计算的值上调用,以生成操作的结果.第3段1在这些操作中的任何一个中,x给出的表达式仅被评估一次,而y给出的表达式未被评估或仅评估一次.第4段1有关实现operator true和operator false的类型的示例,请参见§18.4.2.由x给出的表达式仅被评估一次,并且由y给出的表达式未被评估或仅评估一次.第4段1有关实现operator true和operator false的类型的示例,请参见§18.4.2.由x给出的表达式仅被评估一次,并且由y给出的表达式未被评估或仅评估一次.第4段1有关实现operator true和operator false的类型的示例,请参见§18.4.2.

  • `&`,`|`和`^`重载.对于两个布尔值,它们只是渴望(非条件)逻辑运算符(ECMA-364§14.10.3) (4认同)