c ++中的好习惯(懒惰评估)

roo*_*kie 7 c++ lazy-evaluation

关于c ++的懒惰评估,我有一些问题,我能确定这段代码总能正常工作,还是不好主意?如果是,为什么?提前致谢

if(currentNode == 0 ||*currentNode == element){return; }

Pét*_*rök 19

它保证工作:从左到右计算逻辑AND和OR表达式链,如果第一个子表达式满足条件,则不再评估其他子表达式.

在您的情况下,如果currentNode为null,它将永远不会被第二个子表达式取消引用,因此代码是安全的.

正如@jdv指出的那样,这称为短路评估,而不是懒惰评估.后者是一种编程技术,您可以透明地向客户端仅在第一次具体需要时计算所需值.一个简单的例子:

class Example {
  SomeClass *theObject = null;
public:
  SomeClass *getTheObject() {
    if (!theObject) {
      theObject = doResourceConsumingCalculation();
    }
    return theObject;
  }
};
Run Code Online (Sandbox Code Playgroud)

请注意,客户端Example不知道theObject延迟评估的实现细节,因此您可以在急切和惰性评估之间来回切换,而不会影响类的公共接口.

(当然,在实际的生产代码中,getTheObject应该在一个单独的cpp文件中实现,它应该包括同步,错误处理代码等.这只是一个简单的例子:-)


小智 12

是的,这是安全的.它被称为短路布尔评估.

对于completenes,值得一提的是原则上可以覆盖|| 和&&运营商.如果这样做,这将打破短路评估,因此不会被推荐.