这是我的代码,它有一个字符数组和字符变量。
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时也是如此;
我理解这一点,因为它是围绕字谜的许多算法的基础。
答案 0 :(得分:3)
执行chArr[ch]++
时,它会增加数组中索引ch
的值。
由于chArr[]
包含字符,因此这会将字符按顺序递增为下一个字符 - 因此它会将'A'
转换为'B'
,或'B'
转换为{ {1}}等等。例如,如果'C'
的值为65,则向其中添加一个将使其为66,这是'A'
的字符代码。
(你的例子是你在代码为0的字符(nul字符)中加1,这将产生代码为1的字符(SOH或“头部开头”字符),但原则是无论实际的字符代码如何都一样。)
理论上你可以使用它来计算字符出现的次数(达到一定的限制),因为你可以通过适当的强制转换将字符视为一个计数数字 - 但这将是这是一个糟糕的方式;你不应该将字符视为计数数字。这不编译:
'B'
因为chArr[ch] = chArr[ch] + 1;
被转换为chArr[ch] + 1
来执行算术,然后无法将其放回到char数组中。
可是:
int
在执行增量时不会将char转换为int,因此编译好。
请注意,以下行将编译好,因为我们将chArr[ch]++
结果转换回int
,然后将其放入char数组中:
char
另请注意,chArr[ch] = (char)(chArr[ch] + 1);
等同于执行上述操作,这就是编译的原因。
编译器理解它需要将结果视为与数组相同的类型,因此它看起来好像是为你执行转换。
你真的想做什么?
如果您的目标是计算每个字符的出现次数,则应使用chArr[ch]++
数组,因为您对计数感兴趣。你想要完成什么?
<强>附录强>
如果你确实想要计算某些文本中所有字符的出现次数,一种好方法是使用int
,其中每个字符映射到整数计数。计数后,如果字典中没有出现字符,则表示字符串中没有出现该字符。
代码如下所示:
Dictionary<char, int>