1. 背景
#include <iostream>
#include <string>
using namespace std;
int main()
{
string s1="abcd";
for(int i=0; i<s1.size()-3; ++i) cout<<s1[i];
cout<<endl;
string s2="ab";
for(int i=0; i<s2.size()-3; ++i) cout<<s2[i];
cout<<endl;
return 0;
}
??現(xiàn)有如上程序,其功能是遍歷字符串前s.size()-3個字符。運(yùn)行程序發(fā)現(xiàn)s1可以正常打印,但s2字符個數(shù)不足3個,本不應(yīng)該被打印的,但結(jié)果是打印出一串未知的字符串。

2. 分析與修改
??s.size()函數(shù)返回值的實際類型是string::size_type,該類型是一個無符號整型數(shù)。在表達(dá)式中混用unsigned int與int可能產(chǎn)生意想不到的結(jié)果。
??例如s.size()-3,由于s.size()返回?zé)o符號數(shù),故當(dāng)s.size()<3時,s.size()-3依舊是正數(shù),而非負(fù)數(shù)。
#include <iostream>
#include <string>
using namespace std;
int main()
{
string s1="abcd";
cout<<s1.size()-3<<endl;
string s2="ab";
cout<<s2.size()-3<<endl;
return 0;
}

??故在將s.size()與int作加減或比較,應(yīng)盡量先將其轉(zhuǎn)換成int。
#include <iostream>
#include <string>
using namespace std;
int main()
{
string s1="abcd";
int n1=s1.size();
for(int i=0; i<n1-3; ++i) cout<<s1[i];
cout<<endl;
string s2="ab";
int n2=s2.size();
for(int i=0; i<n2-3; ++i) cout<<s2[i];
cout<<endl;
return 0;
}
