在C ++和C#中是以预定或随机顺序执行的多个条件检查?

时间:2009-05-07 21:51:56

标签: c# c++ deterministic non-deterministic

情况:使用许多标准在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 个答案:

答案 0 :(得分: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# Operators及其顺序或优先顺序。

答案 1 :(得分:2)

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

答案 2 :(得分:0)

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

以下是C#语言规范中的operator precedence。从规范......

  

除了赋值运算符,   所有二元运算符都是   左联想,意思是   操作从左到右执行   对。例如,x + y + z是   评估为(x + y)+ z。

答案 3 :(得分:0)

必须从左到右执行。这样就可以进行短路评估。

有关详细信息,请参阅Wikipedia article