C++ for循环奇怪的行为

use*_*411 0 c++ loops for-loop

我相信下面的两个循环是相同的,任何人都知道为什么它们的情况不同| s1 | > | s2 |?

string s1 = "abcd";
string s2 = "abc";

int s1len = s1.length()
int s2len = s2.length()

for (int i = 0; i <= s2len - s1len; i++) {
    // it will never calls (as expected, since 3 - 4 = -1)
}

for (int i = 0; i <= s2.length() - s1.length(); i++) {
    // it calls once (which is strange)
}
Run Code Online (Sandbox Code Playgroud)

jua*_*nza 5

std::string::length()返回无符号整数类型.无符号的intergal类型遵循模运算,这样-1映射到该类型的larges值.这意味着第二个循环中的减法产生一个非常大的数而不是一个负数.

你可以尝试这个来自己搞清楚:

std::cout << s2.length() - s1.length() << std::endl;
Run Code Online (Sandbox Code Playgroud)