为什么这两个代码片段的行为不等效?

问题描述 投票:0回答:1

我有以下功能(对于示例的情况进行了简化):

bool _move (class Square * const cpOldSquare, class Square * const cpNewSquare, const bool & rcOverride = false) {
    if (rcOverride ? true :
        (!!cpOldSquare->mupChesspiece
            && cpOldSquare->mupChesspiece->mcColour == _player
            && ISINSIDE(cpOldSquare->mupChesspiece->mContinuation.mrcvcpGetList(), cpNewSquare)))
        // do something

现在,我从下面的代码中调用这个函数。我引入

rcOverride
bool 是为了优化
_move
函数,因为从逻辑上讲,从这个环境调用该函数时,if 语句的所有条件都满足,所以我不需要再次测试这些条件。

for (const auto * const & rcpcChesspiece : _chessboard.mPieces.mrcvcpGetList()) {
        if (rcpcChesspiece->mcColour != _player) continue;
        for (auto * const & rcpSquare : rcpcChesspiece->mContinuation.mrcvcpGetList())
            if (_move(rcpcChesspiece->mpSquare, rcpSquare, true))
                // do something
    }

然而,我遇到了一个段错误,我已经能够查明该错误来自于第三个条件不真实(

ISINSIDE
宏,定义为
#define ISINSIDE(x,y) (std::find(x.begin(), x.end(), y) != x.end())
)。

如果我删除

true
覆盖,程序将正常运行,允许它测试第三个条件,并且随后不运行 if 语句内的代码。

您可能不同意我处理此优化工作的方式,但看看所有变量,它们来自哪里(从逻辑上讲——看看第二个代码块中基于范围的 for 循环),我必须得出结论,他们应该表现得同等

ISINSIDE
必须始终评估为
true
,对吧?你能看出行为差异从何而来吗?

c++ if-statement equivalent equivalence
1个回答
0
投票

打开样板,代码正在测试容器是否

rcpcChesspiece->mpSquare->mupChesspiece->mContinuation.mrcvcpGetList()

包含

rcpSquare
。凭借 range-for 循环,我们知道它应该包含在

rcpcChesspiece->mContinuation.mrcvcpGetList()

根据所提供的代码,没有足够的信息来断定这些容器必须始终相等,或者一个容器的成员始终是另一个容器的成员。

© www.soinside.com 2019 - 2024. All rights reserved.