43

下面有两个 if 语句使用逻辑运算符具有多个条件。逻辑上两者相同,但检查顺序不同。第一个有效,第二个失败。

我参考了MSDN来检查是否定义了条件的执行顺序;但我找不到。

考虑具有&&作为逻辑运算符的多重检查条件。是否保证它将始终检查第一个条件,如果不满足第二个条件将被检查?

我曾经使用方法1,效果很好。寻找证实使用的 MSDN 参考。

更新

参考“短路”评估

代码

  List<string> employees = null;  

  if (employees != null && employees.Count > 0)
  {
        string theEmployee = employees[0];
  }

  if (employees.Count > 0 && employees != null)
  {
        string theEmployee = employees[0];
  }
4

8 回答 8

78

&& 和 || 运营商短路。那是:

1) 如果 && 将其第一个操作数评估为假,则它不会评估其第二个操作数。

2) 如果 || 将其第一个操作数评估为真,它不评估其第二个操作数。

这使您可以对对象进行空检查 && 做某事,就好像它不为空一样,第二个操作数不被评估。

于 2013-05-23T10:07:35.533 回答
12

你应该使用:

  if (employees != null && employees.Count > 0)
  {
        string theEmployee = employees[0];
  }

&&如果is会短路并且employees.Count不会被执行。employeesnull

employees在您的第二个示例中,如果null您尝试Count使用集合中的元素,应用程序将引发异常。

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

于 2013-05-23T10:07:27.270 回答
8

从左到右检查条件。&&如果左侧条件为真,操作员将仅评估右侧条件。

C# 语言规范的第 5.3.3.24 节指出:

5.3.3.24 && 表达式

对于形式为 的表达式exprexpr-first && expr-second

· v beforeexpr-first的确定赋值状态与 v 在 expr 之前的确定赋值状态相同。

·expr-second如果v after 的状态expr-first是明确分配的或者“在真表达式之后明确分配”,则v before 的明确分配状态是肯定分配的。否则,它不是绝对分配的。

· expr 后 v 的明确赋值状态由下式确定:

o 如果 v after 的状态expr-first是肯定赋值的,那么 v 在 expr 之后的状态肯定是赋值的。

o 否则,如果v after 的状态expr-second是肯定赋值的,并且v after 的状态expr-first是“false 表达式后肯定赋值”,那么expr 之后的v 状态肯定是赋值。

o 否则,如果 v after 的状态expr-second是肯定赋值或“在真表达式后肯定赋值”,则 v 在 expr 之后的状态是“肯定在真表达式后赋值”。

o 否则,如果 v after 的状态expr-first是“肯定在假表达式之后赋值”,并且 v after 的状态expr-second是“肯定在假表达式之后赋值”,那么 v 在 expr 之后的状态是“肯定在假表达式之后赋值”。

o 否则,在 expr 之后的 v 的状态不是明确指定的。

所以这清楚地表明expr-first总是被评估,如果为真,那么只有这样,expr-second才会被评估。

于 2013-05-23T10:08:30.730 回答
5

&& 和 || 运算符通常用于检查对象条件。

1) "&&" 条件将其第一个操作数评估为假,它不评估其第二个操作数。如果它返回 true,则计算第二个条件。如果第二个条件为真,那么只有它会返回真。因此 && 可用于确保所有条件都满足有效。

2)“||” 条件将其第一个操作数评估为真,它不评估其第二个操作数。如果第一个条件评估为假,那么只有它会评估为第二个条件。如果满足,则返回true。否则为假。

于 2014-03-18T10:32:32.347 回答
4

从左到右,而表达仍然值得怀疑。

于 2013-05-23T10:20:08.677 回答
2

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

于 2013-05-23T10:07:52.067 回答
0

是否保证它将始终检查第一个条件,如果不满足第二个条件将不会被检查?

简短的回答是肯定的。

于 2013-05-23T10:38:42.747 回答
0

例如,请参阅此 MSDN 页面中的&&,其中描述了短路评估。

您可以像这样检查或证明执行顺序:

int i;
bool b;
b=((i=3)==0 && (i=4)!=0);
Console.WriteLine(i);
b=((i=3)!=0 || (i=4)!=0);
Console.WriteLine(i);

在这两种情况下你都得到 3 - 这表明在这两种情况下都会发生短路行为。另一方面,您可以分别使用逻辑运算符“&”或“|”来防止这种情况。这样您将得到 4 的结果,因为这两个条件都已评估。

于 2013-05-23T10:49:38.903 回答