7

情况:在 C++ 或 C# 中使用许多条件检查条件:

if (condition1 && condition2 && condition3)
{
    // Do something
}

我一直认为执行这些检查的顺序并不能保证。所以不一定是第一个条件1,然后是条件2,然后才是条件3。我在使用 C++ 的时候就学会了它。我想我被告知或在某处读过它。

直到知道我一直编写安全代码来解释以下情况下可能出现的空指针:

if ((object != null) && (object.SomeFunc() != value))
{
    // A bad way of checking (or so I thought)
}

所以我在写:

if (object != null)
{
    if (object.SomeFunc() != value)
    {
        // A much better and safer way
    }
}

因为我不确定非空检查是否会首先运行,然后才会调用实例方法来执行第二次检查。

现在,我们最伟大的社区人士告诉我,这些检查的执行顺序保证以从左到右的顺序运行。

我很惊讶。C++ 和 C# 语言真的如此吗?

有人听过我以前听过的版本吗?

4

4 回答 4

14

短路评估是从左到右的简短答案。顺序是可以预测的。

// perfectly legal and quite a standard way to express in C++/C#
if( x != null && x.Count > 0 ) ...

某些语言在分支之前评估条件中的所有内容(例如 VB6)。

// will fail in VB6 if x is Nothing. 
If x Is Not Nothing And x.Count > 0 Then ...

参考:MSDN C# 运算符及其顺序或优先级。

于 2009-05-07T21:55:12.163 回答
2

它们被定义为从左到右进行评估,在其中一个评估为假时停止评估。在 C++ 和 C# 中都是如此。

于 2009-05-07T21:55:48.993 回答
0

我认为没有或曾经有任何其他方式。这就像编译器决定无缘无故地乱序运行语句。:) 现在,某些语言(如 VB.NET)具有用于短路和不短路的不同逻辑运算符。但是,顺序总是在编译时很好地定义。

这是C# 语言规范中的运算符优先级。从规格...

除赋值运算符外,所有二元运算符都是左结合的,这意味着运算是从左到右执行的。例如,x + y + z 被计算为 (x + y) + z。

于 2009-05-07T21:56:43.267 回答
0

它们必须从左到右进行。这允许短路评估工作。

有关更多信息,请参阅维基百科文章

于 2009-05-07T21:57:25.760 回答