我的印象是以下代码会打印出“hello world”,但它根本不会打印任何内容。为什么? 使用g ++ 4.2.1和cl ++ 3.2编译。
void iterateBackwards(){
std::string hiThere = "dlrow olleh";
for ( int i = hiThere.length(); i == 0; i--) {
std::cout << hiThere[i];
}
}
答案 0 :(得分:5)
您的情况应为i >= 0
,而不是i == 0
(条件为for
后,false
循环退出,这在您的示例中就是这种情况。
此外,一旦解决了这个问题,你应该将赋值修复为i
,因为下标运算符接受从零开始的索引;这意味着当i == hiThere.length()
你将访问字符串的终止符时,你可能对输出没兴趣。
这应该更好:
void iterateBackwards(){
std::string hiThere = "dlrow olleh";
for ( int i = hiThere.length() - 1; i >= 0; i--) {
std::cout << hiThere[i];
}
}
这是live example。
答案 1 :(得分:2)
i >= 0
。否则程序将永远不会进入循环体 - 只要i == 0
为真,它就会循环,并将i
设置为字符串的长度。i
应使用hiThere.length() - 1
进行初始化。否则你将有未定义的行为 - C ++中的字符串和数组是0索引的,即第一个索引是0
,最后一个是size - 1
(所以hiThere[hiThere.length() - 1]
是{{的最后一个元素1}})。您应该查看C ++迭代器:
hiThere
答案 2 :(得分:1)
@AndyProwl已经提供了一个解决方案,我将在这里复制以便于与我的比较:
std::string hiThere = "dlrow olleh";
for ( int i = hiThere.length() - 1; i >= 0; i--) {
std::cout << hiThere[i];
}
为了完整起见,你也可以这样写(并且因为你可能会遇到它而值得知道这个形式 - 请注意它完全等同于Andy的解决方案):
std::string hiThere = "dlrow olleh";
for (size_t i = hiThere.length(); i--; ) {
std::cout << hiThere[i];
}
一些评论:
for
循环不同,这里使用后递减运算符而不是通常的预递减运算符非常重要,整个事情都依赖于它。但老实说,我更喜欢@ woytaz的迭代器解决方案,因为它与STL的其余部分更加一致。
答案 3 :(得分:0)
此外,你在for循环中的条件应该是
i >= 0
而不是
i == 0
这是因为for循环只要为真就会迭代,如果使用i == 0,它将为FALSE。