当你这样做时chArr[ch]++
,它会增加ch
数组中索引处的值。
因为chArr[]
包含字符,所以这会将字符递增为顺序中的下一个字符-因此它将转换'A'
为'B'
,或'B'
to'C'
等等。例如,如果'A'
值为 65,则向其添加 1 将使其变为 66,即'B'
.
(您的示例让您将 1 添加到代码为 0 的字符(nul 字符),这将产生代码为 1 的字符(SOH,或“标题开头”字符),但无论如何原理都是相同的的实际字符代码。)
理论上,您可以使用它来计算字符的出现次数(达到一定限制),因为您可以通过适当的转换将字符视为计数 - 但这是一种不好的方法;您不应该将字符视为计数。
这不编译:
chArr[ch] = chArr[ch] + 1;
因为chArr[ch] + 1
被转换为 anint
来进行算术运算,然后不能将其放回 char 数组中。
但:
chArr[ch]++
在进行增量时不会将 char 转换为 int,因此可以编译。
请注意,以下行将编译正常,因为我们在将结果放入 char 数组之前将其转换int
回:char
chArr[ch] = (char)(chArr[ch] + 1);
另请注意,这chArr[ch]++
相当于执行上述操作,这就是它编译的原因。
编译器知道它需要将结果视为与数组相同的类型,以便它看起来好像它为您进行了强制转换。
你真正想做的是什么?
如果您的目标是计算每个字符的出现次数,则应该使用int
数组,因为您对计数感兴趣。你想达到什么目的?
附录
如果您确实想计算某些文本中所有字符的出现次数,一种好方法是使用Dictionary<char, int>
每个字符映射到整数计数的位置。计数后,如果一个字符没有出现在字典中,则表示该字符没有出现在字符串中。
代码如下所示:
string testString = "The owls are not what they seem.";
var counts = new Dictionary<char, int>();
foreach (var ch in testString)
{
if (!counts.ContainsKey(ch))
counts.Add(ch, 0);
++counts[ch];
}
foreach (var count in counts)
Console.WriteLine("{0}: {1} times.", count.Key, count.Value);