今天在力扣刷算法题的时候,自己写了一个类似于如下代码的for循环,结果出了bug,折腾了半个小时终于弄清楚了原因。
string s = "";
for (int i = 0; i < s.length() - 1; ++i) {
cout << "进入for循环";
}
按照我最先的想法s.length()的返回值为0,那么0<0-1,显然不可能进入for循环,但如果运行上面这段代码,却可以打印出"进入for循环"。
查找资料发现std::string::length返回的是unsigned integral类型,即无符号整形,而无符号数与有符号数运算时,会默认将有符号数当做无符号数来处理
而s.length() - 1的真实值为4294967295
string s = "";
unsigned int x = s.length() - 1;
cout << x;
至于为什么为这个值,就要来探讨原码、补码以及有符号数和无符号数的储存方式,之后再做补充