情况:使用许多标准在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#语言来说真的如此吗?
还有其他人听过我之前听过的版本吗?
答案 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。