代码之家  ›  专栏  ›  技术社区  ›  User

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

  •  7
  • User  · 技术社区  · 15 年前

    情境: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
        }
    }
    

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

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

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

    4 回复  |  直到 15 年前
        1
  •  14
  •   Robert Paulson    15 年前

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

    // 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 ...
    

    C# Operators 以及它们的顺序或优先顺序。

        2
  •  2
  •   RichieHindle    15 年前

    它们被定义为从左到右进行评估,

        3
  •  0
  •   JP Alioto    15 年前

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

    operator precedence 从C语言规范。从规范。。。

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

        4
  •  0
  •   rahularyansharma    15 年前

    看到了吗 Wikipedia article 更多信息。