Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.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# 编译器是否继续计算一个表达式,如果第一个表达式为false,则所有表达式都必须为true?_C#_.net_Boolean Logic - Fatal编程技术网

C# 编译器是否继续计算一个表达式,如果第一个表达式为false,则所有表达式都必须为true?

C# 编译器是否继续计算一个表达式,如果第一个表达式为false,则所有表达式都必须为true?,c#,.net,boolean-logic,C#,.net,Boolean Logic,我确信这个问题以前可能已经被回答过,所以我很抱歉,但是我无法找到合适的搜索词来找到答案 给定以下代码示例,db.GetRecords().Any()是否执行 string s = "Z"; bool x = s.IndexOfAny(new[] { 'A', 'B' }) > 0 && db.GetRecords().Any(); 否。&&运算符短路(这意味着它在表达式的任何部分计算为false后停止计算表达式) |运算符也会短路,但在表达式的任何部分求

我确信这个问题以前可能已经被回答过,所以我很抱歉,但是我无法找到合适的搜索词来找到答案

给定以下代码示例,
db.GetRecords().Any()
是否执行

string s = "Z";
bool x = s.IndexOfAny(new[] { 'A', 'B' }) > 0 &&
         db.GetRecords().Any();

否。
&&
运算符短路(这意味着它在表达式的任何部分计算为false后停止计算表达式)

|
运算符也会短路,但在表达式的任何部分求值为true后停止求值。

否,C#使用短路和。所以答案是否定的

tring s = "Z";
bool x = s.IndexOfAny(new[] { 'A', 'B' }) > 0 &
         db.GetRecords().Any();
如果需要对两者进行评估,请使用非短路运算符,只使用一个与&

tring s = "Z";
bool x = s.IndexOfAny(new[] { 'A', 'B' }) > 0 &
         db.GetRecords().Any();
请注意单张

编号

tring s = "Z";
bool x = s.IndexOfAny(new[] { 'A', 'B' }) > 0 &
         db.GetRecords().Any();


否。
&&
|
都由评估。这意味着如果
a
为false,则
a和&b
返回false;如果
a
为true,则
a
返回true,并且在这两种情况下都不会计算
b


如果出于某种原因,您不希望进行短路评估,则可以使用位运算符
&
|

这是短路,允许您执行以下操作:

if(ob && ob.somefunc()) { ... }
如果对这两个操作都进行了求值,则有可能引用null对象,这将是运行时异常。

我说,对于C#logic AND(),第二个表达式为false,因为它们都需要为true才能使表达式为true,所以编译器立即停止求值

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

与逻辑AND相反,逻辑OR()只需要所有表达式中的一个表达式为真,整个表达式才为真。因此,
|
运算符不会在
求值上短路,而是导致编译器在真求值上短路

这就是C#编译器的行为,但这并不意味着每个编译器都是这样的,就像在VB.NET中一样,有两个逻辑AND运算符(,),和两个逻辑OR运算符(
或else
)。用于位连接和逻辑连接的
运算符在第一个表达式返回false时不会短路并对另一个表达式进行求值,而
运算符在第一个逻辑表达式为false时也会短路求值。这与
OrElse
相同,其中
不会短路,而
OrElse
会短路

对两个布尔表达式执行逻辑运算,或对两个数值表达式执行位运算

对两个表达式执行短路逻辑连接

对两个布尔表达式执行逻辑析取,或对两个数值表达式执行位析取

对两个表达式执行短路包容逻辑析取


简而言之,这取决于您使用的编译器。至于C#,它会短路。

你可以用一些更简单的函数试试,你会得到你的答案。@Gunner说得对。我应该想到这一点。我想今天早上还没有足够的咖啡。
|
在检测到一个参数为假时不会停止计算。@Malfist:我不需要。你是说
false | | true
的计算结果应该是
false
?@Jason Wow。做了一个快速的编辑,显然没有考虑我输入的内容。后退。。。需要更多的咖啡。实际上有什么好的理由使用单数&和|?@eddy56&和|来计算可以设置多个标志的标志。我想你的意思是
如果(ob!=null&&..
因为唯一可行的方法是ob是bool,bool没有真正的方法,除非您创建了somefunc作为扩展方法,在这一点上,ob是否定义并不一定重要。