C++ 短路评估的条件是什么?[复制]

C++ What are the conditions of short circuit evaluation? [duplicate]

提问人:cupbear 提问时间:8/9/2022 最后编辑:Jeremy Friesnercupbear 更新时间:8/9/2022 访问量:115

问:

if (i - word.size() >= 0 && dp[i - word.size()] && s.substr(i - word.size(), word.size()) == word)
    dp[i] = true;

i - word.size() >= 0是我用来防止越界索引的条件。预期是,如果不满足条件,方程将短路,参考不会发生。dp[i - word.size()]

但是,无论第一个条件如何,引用都会发生。只有当我将代码更改为以下内容时,它才开始短路。

int lookback = i - word.size();
if (lookback >= 0 && dp[lookback] && s.substr(i - word.size(), word.size()) == word)
    dp[i] = true;

为什么第二个代码短路,而第一个代码不会?我读过,如果逻辑运算符过载,则不会发生短路,但这里似乎并非如此,我无法弄清楚为什么它没有发生。&&||

下面是上下文的完整代码

bool wordBreakFaulty(string s, vector<string>& wordDict) {
    int n = s.size() + 1;
    vector<bool> dp(n, false);
    dp[0] = true;
    for (int i = 1; i < dp.size(); ++i) {
        for (auto& word : wordDict) {
            if (i - word.size() >= 0 && dp[i - word.size()] && s.substr(i - word.size(), word.size()) == word)
                dp[i] = true;
        }
    }

    return dp.back();
}
C++ 短路评估

评论

0赞 Nate Eldredge 8/9/2022
检查返回的类型。然后阅读有关算术转换的信息word.size()
1赞 phuclv 8/9/2022
始终启用编译器警告。您将收到强制转换警告或“始终为真”警告int lookback = i - word.size();i - word.size() >= 0
0赞 cupbear 8/9/2022
谢谢!!!!我真的应该想到它。
1赞 Pete Becker 8/9/2022
@phuclv - 您会收到转化警告。该代码中没有强制转换。

答: 暂无答案