C# If语句中条件的执行顺序

55

以下有两个if语句,它们使用逻辑运算符具有多个条件。逻辑上两者相同,但检查顺序不同。第一个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
搜索"短路"。 - David
8个回答

90

&& 和 || 运算符会进行短路运算。也就是说:

1) 如果 && 把它的第一个操作数计算为 false,则不会计算第二个操作数。

2) 如果 || 把它的第一个操作数计算为 true,则不会计算第二个操作数。

这使您可以进行空值检查并对对象执行某些操作,如果它不为空,则不评估第二个操作数。


6
请问您需要的翻译是:“@Lijo 搜索“msdn short-circuit”,前两个结果是此链接和此链接。这些足够吗?” - Bernhard Barker

12

你应该使用:

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

&&会短路并且如果employeesnullemployees.Count将不会被执行。

在你的第二个示例中,当你尝试计算集合中的元素数量时,如果employeesnull,应用程序将抛出异常。

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


8
条件从左到右检查。如果左条件为真,&& 运算符只会评估右条件。
C#语言规范的5.3.3.24节规定:
5.3.3.24 && 表达式
对于形如 expr-first && expr-second 的表达式 expr
· 在 expr-first 之前 v 的明确赋值状态与在 expr 之前 v 的明确赋值状态相同。
· 如果 expr-first 之后的 v 状态是已确定赋值或“在 true 表达式之后被确定赋值”,则 expr-second 之前的 v 状态肯定已经赋值。否则,它不是明确赋值的。
· v 在 expr 之后的明确赋值状态由以下方式确定:
o 如果 expr-first 之后的 v 状态是已确定赋值,则 expr 之后的 v 状态也是已确定赋值。
o 否则,如果 expr-second 之后的 v 状态是已确定赋值,并且 expr-first 之后的 v 状态是“在 false 表达式之后被确定赋值”,则 expr 之后的 v 状态是已确定赋值。
o 否则,如果 expr-second 之后的 v 状态是已确定赋值或“在 true 表达式之后被确定赋值”,则 expr 之后的 v 状态是“在 true 表达式之后被确定赋值”。
o 否则,如果 expr-first 之后的 v 状态是“在 false 表达式之后被确定赋值”,并且 expr-second 之后的 v 状态是“在 false 表达式之后被确定赋值”,则 expr 之后的 v 状态是“在 false 表达式之后被确定赋值”。
o 否则,expr 之后的 v 状态不是明确赋值。
因此,这使得 expr-first 总是被评估,如果它为真,那么只有在这种情况下才会评估 expr-second

请注意,这对于C/C++也是正确的。 - jrh

7

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

1) "&&" 条件将其第一个操作数评估为 false,不会评估其第二个操作数。如果它返回 true,则评估第二个条件。如果第二个条件为 true,则只有它才会返回 true。因此,可以使用 && 确保所有条件都满足有效性。

2) "||" 条件将其第一个操作数评估为 true,不会评估其第二个操作数。如果第一个条件评估为 false,则只会评估第二个条件。如果满足,则返回 true。否则,返回 false。


4
从左到右,而表达式仍然是可疑的。

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

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的结果,因为两个条件都已经被评估了。

0
“它是否保证始终检查第一个条件,如果不满足第一个条件,则不会检查第二个条件?” 简短的回答是“是”。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接