使用'&'与'&&'

V4V*_*tta 55 c#

我遇到了这个:

bool Isvalid = isValid & CheckSomething()

bool Isvalid = isValid && CheckSomething()
Run Code Online (Sandbox Code Playgroud)

第二种情况可能是短路的情况.

所以我们不能总是只使用&而不是&&

Tal*_*joe 65

&是一个有点"AND",意味着它在位级别上工作.&&是逻辑"AND",意味着它在布尔(true/false)级别工作.逻辑AND使用短路(如果第一部分是假的,没有用于检查第二部分)以防止运行多余的代码,而逐位AND需要和每一位,所以它将获得值.

你应该使用逻辑AND(&&),因为这就是你想要的东西(并且可能没有做正确的事情),但如果你想评估它的副作用,你可能需要单独运行该方法:

var check = CheckSomething();
bool IsValid = isValid && check;
Run Code Online (Sandbox Code Playgroud)

  • 当应用于布尔值时,两种形式都是逻辑AND; 只是'&&`版本是短路的. (14认同)
  • @ V4Vendetta:如果使用`&`那么``CheckSomething`将始终被调用,无论`isValid`的值如何.如果你使用`&&`那么只有``isValid`为真时才会调用`CheckSomething`.无论你使用`&`还是`&&`,表达式本身的结果都应该是相同的.(由您来决定在什么情况下需要调用`CheckSomething`.) (4认同)
  • [这个答案正在讨论meta.](https://meta.stackoverflow.com/questions/366943/edited-incorrect-answer-edit-was-rolled-back) (4认同)
  • @LukeH由于C#和CLI规范之间存在差异,显然`&`和`&&`do******在与布尔值一起使用时总是具有相同的输出.请在此处查看我的问题:http://stackoverflow.com/q/24683107/3303123 (3认同)
  • 这个答案在 C# 的应用中是不正确的。其他语言将“&”用作按位,但 C# 仅在用于整数值时将其用作按位,但对于布尔值,它不会按位,而是计算两个操作数的逻辑 AND。请参阅[此链接](https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/operators/boolean-逻辑-operators#:~:text=null%2Dforgiving%20operator.-,Logical %20AND%20运算符%20%26,否则%2C%20%20结果%20为%20假%20。)。`adjan` 的答案应该被标记为正确答案。 (3认同)
  • @LukeH,使用`&`表示布尔表达式的人是那些喜欢玩语言功能而又不考虑代码的可读性的程序员。 (2认同)
  • 只是为了记录,您称为按位运算符的称为逻辑运算符,您称为逻辑运算符的称为条件运算符。也许最好坚持MS声明的命名,以避免如果您自己声明不正确,以避免混淆。来源:http://msdn.microsoft.com/cs-cz/library/6a71f45d.aspx。 (2认同)
  • 这个答案在当前状态下是如此错误 (2认同)
  • “*[准确地说,在 C# 中,这些运算符(&、| [和 ^\])称为“逻辑运算符”(请参阅​​ C# 规范,第 7.11 章)。](https://stackoverflow.com/questions /7331686/为什么与不/7331721#7331721)*" (2认同)
  • 尽管 & 实际上在使用布尔值作为操作数时可能是按位运算符,但本文档并没有这样讨论它:https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/operators/boolean -逻辑运算符#逻辑和运算符- (2认同)
  • & 和 | 应用于布尔表达式时是布尔比较...应用于数字时它们执行按位比较。(C 和 C++ 的行为不是这样的。) (2认同)

opi*_*ahn 13

在&&中,第二个表达式仅在第一个表达式为真时进行评估.

而&只是一种连接两个表达式的方法,如true&true = true,true&false = false等.

  • 这不是“连接”的意思。你的第二句话是有害的。 (3认同)

Adr*_*ian 11

C#有两种类型的布尔逻辑运算符:

  1. x & y 逻辑和

    • true仅在结果xy评估结果true
    • 评估 xy.
  2. x && y 条件逻辑AND

    • true仅在结果xy评估结果true
    • x首先x进行评估,如果评估为false,则false立即返回而不进行评估y(短路)

因此,如果您依赖于两者xy进行评估,您可以使用&运算符,尽管它很少使用且难以阅读,因为副作用对读者来说并不总是很清楚.

注意:二进制&运算符也存在于整数类型,它执行按位逻辑AND.

  • 这确实需要标记为正确答案。Talljoe 的答案对 C# 特性有误导性,并且会导致未阅读所有评论和答案的读者得出错误的结论。 (2认同)

Ple*_*eun 6

我相信你错过了什么.在第二个场景中,如果isValid为false,则不评估CheckSomething

条件AND运算符(&&)执行其bool操作数的逻辑AND,但仅在必要时才计算其第二个操作数.

http://msdn.microsoft.com/en-us/library/2a723cdk(v=vs.71).aspx