在C++;和C#是按预定顺序还是随机顺序执行多个条件检查? 情况:C++或C语言中的条件检查有许多标准: if (condition1 && condition2 && condition3) { // Do something }

在C++;和C#是按预定顺序还是随机顺序执行多个条件检查? 情况:C++或C语言中的条件检查有许多标准: if (condition1 && condition2 && condition3) { // Do something },c#,c++,deterministic,non-deterministic,C#,C++,Deterministic,Non Deterministic,我一直认为,执行这些检查的顺序是无法保证的。所以它不一定先是条件1,然后是条件2,然后才是条件3。我在C++时代学会了它。我想是有人告诉我的或是在什么地方读到的 直到我知道之前,我一直编写安全代码来解释以下情况下可能出现的空指针: if ((object != null) && (object.SomeFunc() != value)) { // A bad way of checking (or so I thought) } 所以我在写: if (object !=

我一直认为,执行这些检查的顺序是无法保证的。所以它不一定先是条件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
    }
}
因为我不确定NOTNULL检查是否会首先运行,然后才会调用实例方法来执行第二次检查

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

我很惊讶。C++和C语言都是这样吗?< /P>
还有人听过我以前听过的版本吗?

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

// perfectly legal and quite a standard way to express in C++/C#
if( x != null && x.Count > 0 ) ...
有些语言在分支之前对条件中的所有内容进行求值(例如VB6)


参考:MSDN及其顺序或优先级。

它们被定义为从左到右求值,当其中一个求值为false时停止求值。这在C++和C中都是正确的。

< P>我不认为有或者已经有其他的方式。这就像编译器无缘无故地乱序运行语句一样。:)现在,一些语言(如VB.NET)有不同的短路和非短路逻辑运算符。但是,顺序总是在编译时定义得很好

这是C语言规范中的代码

除赋值运算符外, 所有二进制运算符都是 左联想,意思是 操作从左到右执行 正确的。例如,x+y+z是 计算为(x+y)+z


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


有关更多信息,请参阅。

@Robert:你的意思是“如果x不是什么&&…”(或等效的VB6语法)?@RichieHindle-是的,谢天谢地,我对VB6/VBScript的记忆非常古老。我将更新C#中的子表达式,它们的计算从左到右,始终为句点。C/C++中的子表达式是按顺序点顺序计算的。同一序列点中的两个表达式可以按任意顺序求值。如果你需要一个正式的定义,就在“序列点”上进行网络搜索。同样,子表达式求值的优先级、关联性和顺序是三件不同的事情。你不能从C#中的优先顺序来决定顺序。另外,我很遗憾,你引用的位中的规范措词不当。我一直想把它修好。是的,我明白你的意思。这是违反直觉的,但我认为该操作可以是左关联的,并且仍然可以按照从左到右的顺序进行计算。这两种方法都需要在应用操作之前进行求值,因此优先级并不一定意味着求值顺序。但是你必须放弃短路,因为短路和三个操作数不能用两个操作符和三个操作数,短路和两个操作数不能用。
// will fail in VB6 if x is Nothing. 
If x Is Not Nothing And x.Count > 0 Then ...