You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++回文判断代码中for循环索引起始值为何要减1

C++回文判断代码中,为什么反转字符串的循环初始值要写text.size() - 1?

我在校期间已经学习过C++,近期正在学习Codecademy的C++入门课程。平台上有一道回文单词判断的习题,要求编写函数返回true或false的判断结果。我没能独立解出这道题,查看给出的参考答案如下:

#include <iostream>

// 在此处定义is_palindrome()函数:
bool is_palindrome(std::string text) {
  
  std::string reversed_text = "";
  
  for (int i = text.size() - 1; i >= 0; i--) {
    reversed_text += text[i];
  }
  
  if (reversed_text == text) {
    return true;
  }
  
  return false;
  
}

int main() {
  
  std::cout << is_palindrome("madam") << "\n";
  std::cout << is_palindrome("ada") << "\n";
  std::cout << is_palindrome("lovelace") << "\n";
  
}

我唯一的疑问针对循环部分的代码:

for (int i = text.size() - 1; i >= 0; i--) {
    reversed_text += text[i];
}

我知道这段逻辑是通过字符串索引取值实现反转,但无法理解为什么要对text.size()做减1操作,希望有人能解释其中的逻辑。

提前感谢所有阅读本帖的解答者。我是意大利用户,这是我首次使用Stack Overflow,若我的表达或平台使用方式不够规范,还请谅解。


解答

这是C++(以及绝大多数编程语言)字符串、数组的通用索引规则决定的:所有序列的索引都是从0开始计数,而非从1开始。

拿样例里的"madam"举例:

  • 这个单词一共5个字符,调用text.size()会返回长度值5
  • 但5个字符对应的合法索引范围是0到4,不是1到5:
    • 索引0对应第一个字符'm'
    • 索引1对应第二个字符'a'
    • 索引2对应第三个字符'd'
    • 索引3对应第四个字符'a'
    • 索引4对应第五个(也就是最后一个)字符'm'

这个倒序循环的目的是从字符串末尾往头部逐个取字符,拼接出反转后的字符串。如果初始值直接写text.size()也就是5,访问text[5]就超出了字符串的合法内存范围,会触发未定义行为——可能读到乱码,也可能直接导致程序崩溃。
所以初始值要写text.size() - 1,刚好定位到字符串最后一个字符的位置,之后每次循环i减1往前移动一位,直到i >= 0取到第一个字符,就能完整遍历整个字符串,得到正确的反转结果。


内容的提问来源于stack exchange,提问作者Andrea Corvo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 21:42:15