#include <string>
#include <algorithm>
#include <iostream>
using namespace std;
bool compare( const string::size_type i, const string::size_type j )
{
cout << "comparing " << i << " and " << j << "." << endl;
return i < j;
}
void reverse_inplace( std::string &s )
{
std::string::size_type i = 0;
std::string::size_type j = s.size()-1;
cout << "called" << endl;
while( compare(i,j) );
{
cout << i << " " << j << endl;
std::swap(s[i], s[j]);
++i;
--j;
cout << i << " " << j << endl;
}
}
int main()
{
string s( "a" );
reverse_inplace(s);
cout << s << endl;
}
我的代码出了什么问题?为什么要继续比较,回归真实?并没有执行循环体没有?我试过GCC 4.6和MSVC 10 SP1。由于某些奇怪的原因,循环中的cout
语句没有被执行。
答案 0 :(得分:9)
循环体未被执行,因为在while()行之后有分号,这导致循环体被忽略。因此,增量和减量语句没有被击中;它们都不是cout
。
答案 1 :(得分:3)
首先,您需要在while
语句后删除分号。
其次,您应该使用j
初始化s.size()-1
,否则,它会指向开头的无效索引(1
,在字符串结尾之后) )。这可能会导致许多意外结果。请注意,在这种情况下,您必须检查s.size()==0
,因为size_t
是无符号的,s.size()-1
会为空字符串提供下溢。
第三,如果你需要在生产代码中使用它,你应该看看st std::reverse()
:)