Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#中单个与的第二个含义是什么?_C#_Linq - Fatal编程技术网

C#中单个与的第二个含义是什么?

C#中单个与的第二个含义是什么?,c#,linq,C#,Linq,我在C#中使用了单符号和(&)表示“检查第二个条件语句,即使第一个是假” 但以下似乎是&的不同含义,有人能解释一下i&1在下面的例子中是如何工作的吗 List<int> scores = new List<int> { 1, 2, 3, 4, 5, 6, 7, 8 }; var evenScores = scores.Where(i => i % 2 == 0); var evenScores2 = scores.Where(i => (i & 1)

我在C#中使用了单符号和(&)表示“检查第二个条件语句,即使第一个是

但以下似乎是
&
不同含义,有人能解释一下
i&1
在下面的例子中是如何工作的吗

List<int> scores = new List<int> { 1, 2, 3, 4, 5, 6, 7, 8 };
var evenScores = scores.Where(i => i % 2 == 0);
var evenScores2 = scores.Where(i => (i & 1) == 0);
List分数=新列表{1,2,3,4,5,6,7,8};
var evenScores=分数。其中(i=>i%2==0);
var evenScores2=得分,其中(i=>(i&1)==0);

按位AND运算符。

一元
运算符
返回其操作数的地址(需要
上下文)

二进制
&运算符
是为整数类型和布尔预定义的。对于整数类型,
&
计算其操作数的逻辑位
。对于布尔操作数,
计算其操作数的逻辑
;也就是说,当且仅当其两个操作数都为真时,结果才为真

&运算符
计算两个运算符,而不考虑第一个运算符的值


对于布尔类型,您提到的是它的行为

对于整数类型,它是按位“and”运算符

它可以为其他类型重载


基本上,表达式
(i&1)==0
检查是否设置了
i
的最低有效位,这仅在数字为奇数时发生。

与表示按位与运算。逐位运算符返回两个操作数中每个对应位之间的比较结果

例如,如果x是0110,y是1010,那么x和y的按位and(x&y)结果是0010。

单&是“按位and运算符”,就像前面所说的那样。我在看问题的第二部分:“为什么它有效?”

以二进制方式思考:

 000 = 0
 001 = 1
 010 = 2
 011 = 3
 100 = 4
 101 = 5
 110 = 6
 111 = 7
 and so on

注意所有偶数以0结尾;所以,如果最后一位按位检查1返回零(表示“不匹配”),则为偶数

前面的答案是正确的,但不要说明
&
&
有什么不同,我认为这是你最初的问题,所以我就回答这个问题

如前所述,
是一个按位和<代码>&&
是逻辑AND
&
对其操作数逐位执行AND运算,一般函数与
+
*
或任何算术运算符完全相同<代码>&更复杂。它将每个操作数与零进行比较。如果第一个操作数为零,它将假定值
false
,并使表达式的其余部分短路,即不计算任何剩余的操作数。如果第一个值不为零,则检查第二个值。如果该值为零,则假定值为
false
,否则假定值为
true
。在这两种情况下,它都会继续计算表达式

也就是说,
&
&
之间有两个关键区别:

  • &
    逐位操作,而
    &&
    只考虑零和非零,始终返回0或1。因此
    5和6
    (二进制
    101和110
    )给出4(二进制
    100
    ),而
    5和&6
    给出1(
    true

  • &&
    “短路”。如果第一个值为零,则不计算第二个值<代码>&没有这样的规则。这在以下几个方面很重要:

  • 如果第二个值有任何副作用,则使用
    &
    时,这些副作用总是会发生,而使用
    &
    时,这些副作用不会发生。因此
    x&(y++)
    将始终递增
    y
    ,而
    x&&(y++)
    仅在
    x
    不为零时递增
    y
    。如果第二个操作数是函数调用,则这一点会变得更重要,也可能更微妙
  • 第一个值可能测试确定第二个值无效的内容。像
    x=NULL&&x->foo==3
    。使用
    &
    ,当
    x
    null
    时,可能会出现段故障或类似故障
  • 最后,可能会有重要的绩效提升。比如,
    x!='从数据库读取数据并计算总计(x)
    。有了
    &
    ,不管怎样都会进行读取,这可能完全是浪费时间

  • 这就是为什么我们几乎总是将
    &
    用于真正的逻辑操作,并将
    &
    的使用限制在真正需要位操作的时候。但有时您不希望发生短路,在这种情况下,
    &
    可能是一个不错的选择。但是,如果要使用它进行“逻辑”运算,请非常小心那些可以有0或1以外的任何值的操作数
    1和&2
    true
    ,但是
    1和2
    false

    如果你仔细想想那句话。。。这是低效的。我从这个问题中得到了,它指出了变量的速度更快。在C++中,你可以使用布尔值,因为BoL自动转换为零或一个(和后退)-一旦你优化了铸件,你就留下了与&但不进行短路评估的东西。(因此您可以保证正确的子表达式会产生副作用)。我想这适用于C#和Java,但不一定记得ATM。@Steve:根据OP的问题,他们已经知道这种行为是作为一种不短路布尔逻辑的方式存在的。@Jeff-但他不知道运算符是什么,所以不知道为什么它会起作用。只是试图将现有知识与新知识联系起来,澄清bool行为Edward知道不属于您解释的按位行为和boolint转换行为。感谢您实际解释它。注意,在C#中,
    &
    运算符只能在两个
    bool
    之间使用,因此询问第一个操作数是否为零毫无意义(在C#a
    bool