0

这是我的代码,它有一个字符数组和字符变量。

    char[] chArr = new char[1000];
    char ch='A';
    chArr[0]= 'D';
    //chArr[ch] = chArr[ch] + 1; //fails to compile
    chArr[ch]++ ; //works. But how can it store character and its count that too only with ++?

在这里的最后一行,它增加了字符 A 的计数,而不是增加一个字符'B'。我知道不应该这样做。但我想了解它如何存储每个字符及其在这里算一算,当仅与 ++ 运算符一起使用而不是通过执行 chArr[ch] = chArr[ch] + 1;

我理解这一点,因为它是围绕字谜的许多算法的基础。

4

1 回答 1

3

当你这样做时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);
于 2013-06-30T09:10:58.760 回答