C#回文校验代码中for循环为何要对name.Length执行减1操作
循环中使用
name.Length - 1 作为起始值的核心原因 这本质是由C#的通用索引规则决定的,没有特殊的语法黑魔法:
- C# 中字符串、数组、大部分内置集合的索引都是零基计数的:第一个元素的索引是
0,最后一个元素的索引固定等于「元素总数量 - 1」,而不是总数量本身。 - 拿示例里的字符串
"Apple"举例子,它的Length属性值是5,对应5个字符的索引分别是0(A)、1(p)、2(p)、3(l)、4(e)。如果不做减1处理,直接让循环从i=5开始取name[i],程序会直接抛出IndexOutOfRangeException——因为有效索引范围最多到4,根本不存在索引为5的字符。 - 这种起始值设置刚好匹配你这段回文代码的遍历需求:从字符串的最后一个字符开始,每次向前移动一个位置,直到索引走到最开头的
0位置停止。整个循环会无遗漏、无重复地把所有字符按倒序拼接到reverse变量里,刚好得到原字符串的反转结果,用于和原串做相等性校验。
可以结合实际运行流程更直观地理解这个逻辑:
i从4开始遍历的完整流程: i=4: 取name[4] = 'e' → reverse = "e" i=3: 取name[3] = 'l' → reverse = "el" i=2: 取name[2] = 'p' → reverse = "elp" i=1: 取name[1] = 'p' → reverse = "elpp" i=0: 取name[0] = 'A' → reverse = "elppA" i=-1: 触发i >= 0的终止条件,退出循环
这是C#入门阶段的常见踩坑点:很多刚从使用1基索引的语言(比如VB6、部分Lua实现)转过来的开发者,经常会漏写这个减1的步骤,首次运行代码就会触发越界异常。
内容的提问来源于stack exchange,提问作者LBoyNewbie
相关产品推荐
相关产品推荐

