You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++短路求值失效疑问:两段相似代码为何表现不同?

问题原因分析

核心问题出在类型不匹配导致的隐式类型转换:

  • std::string::size()返回的是无符号整数类型size_t,而循环变量i是有符号的int类型。
  • 在第一段代码中,i - word.size()会触发隐式类型提升:i被转换为size_t后再参与运算。如果i < word.size(),原本的负数结果会被转换成一个极大的正数(无符号整数的溢出规则),导致i - word.size() >= 0这个条件永远为真,短路求值完全失效,后续的dp[i - word.size()]必然会执行,造成数组越界访问。

举个具体例子:假设i=1,word.size()=2,i - word.size()的数学结果是-1,但转换为size_t后会变成SIZE_MAX(比如64位系统下是18446744073709551615),显然满足>=0,所以会执行dp[SIZE_MAX],直接越界。

而第二段代码中:

  • 用int lookback = i - word.size()显式将运算结果转换为有符号的int类型,此时负数结果会被正确保留。当i < word.size()时,lookback是负数,lookback >=0条件不成立,短路求值生效,后续的越界访问代码不会执行。

补充验证

你可以在第一段代码里手动强制类型转换来验证:

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

这样也能触发正常的短路求值,因为强制转换后负数能被正确识别。

内容的提问来源于stack exchange,提问作者cupbear

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 19:36:16