我遇到了这个:
bool Isvalid = isValid & CheckSomething()
bool Isvalid = isValid && CheckSomething()
第二种情况可能是短路的情况。
所以我们不能只使用&
代替&&
吗?
答案 0 :(得分:61)
&安培;是一个有点“AND”,意味着它在位级上工作。 &安培;&安培;是逻辑“AND”意味着它在布尔(true / false)级别工作。逻辑AND使用短路(如果第一部分是假的,则无法检查第二部分)以防止运行多余的代码,而逐位AND需要和每一位,以便它将获得值。
你应该使用逻辑AND(&&),因为这就是你想要的东西(并且可能没有做正确的事情),但如果你想评估它的副作用,你可能需要单独运行该方法: / p>
var check = CheckSomething();
bool IsValid = isValid && check;
答案 1 :(得分:12)
In&&第二个表达式仅在第一个表达式为真时进行评估。
和&只是一种连接两个表达式的方法,比如true& true = true,true& false = false等。
答案 2 :(得分:6)
我相信你错过了一些东西。在第二个场景中,如果isValid为false,则不评估CheckSomething
条件AND运算符(&&)执行其bool操作数的逻辑AND,但只在必要时才计算其第二个操作数。
http://msdn.microsoft.com/en-us/library/2a723cdk(v=vs.71).aspx
答案 3 :(得分:6)
C#有两种类型的布尔逻辑运算符:
x & y
Logical AND
true
仅在x
和y
评估为true
x
和y
。 x && y
Conditional Logical AND
true
仅在x
和y
评估为true
x
,如果x
评估为false
,则会立即返回false
而不评估y
(短路} EM>)因此,如果您依赖于被评估的x
和y
,您可以使用&
运算符,尽管它很少使用且难以阅读,因为副作用并非总是如此向读者清楚。
注意:integer types的二进制&
运算符也存在,它执行按位逻辑AND。
答案 4 :(得分:-3)
我到目前为止拥有的最佳用途
void BooleanTestV1 (){
int num = 0;
bool IsOne = false;
for (int i = 0; i< 100; i++){
num = i;
if (IsOne == false) {
IsOne = num == 1;
}
}
if (IsOne) {
// Yeay it works!
}
}
void BooleanTestV2 (){
int num = 0;
bool IsOne = false;
for (int i = 0; i< 100; i++){
num = i;
if (IsOne == false && (IsOne = num == 1)) {
// Do Somehing...
}
}
if (IsOne) {
// Yeay it works!
}
}
void WhyUseOneAND() {
int num = 0;
bool IsOne = false;
for (int i = 0; i < 100; i++) {
num = i;
if (num < 0 & (IsOne == false && (IsOne = num == 1))) {
// If we are using &&
// isOne will never checking (num == 1)
// Because && will stop running after found a false (num < 0)
// Good for caching (here "IsOne" is the variable we cached)
// Note: anything here will not be executed, cuz num < 0 will never be true
}
}
if (IsOne) {
// Yeay it works!
}
}