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
相关产品推荐
相关产品推荐

