使用n [c-'0']的真正用途是什么?

时间:2011-09-13 14:42:34

标签: c++ c arrays

我是C的新手,我遇到了这样的代码:

int n[10];
if(c>='0' && c<='9')
++n[c-'0']

if循环中为什么我们必须在0周围使用单引号,使用它是什么,为什么我们不能立即将0定义为整数?在第二行代码++n[c-'0']中,使用像这样的数组是什么意思,为什么我们需要减去0(再次为什么在这个上下文中使用单引号?)来自{数组索引中的{1}}?

如果我喜欢这个c,索引操作(n[c-'0'])的结果将是一个字符还是整数?

鉴于任何人都可以说我,这个阵列的实际用途是什么,有什么缺点呢?

提前致谢。

13 个答案:

答案 0 :(得分:16)

在C中,'0'是一个整数,其值表示作为字符的数字零,而不是值0,它将是空字符。其他答案已经省略了这一点,但重要的是要注意C语言要求十进制数字具有连续值,因此如果c是一个数字,c-'0'是该数字的数值,即

'0'-'0' = 0
'1'-'0' = 1
'2'-'0' = 2
.
.
.
'9'-'0' = 9

答案 1 :(得分:6)

c(可能)是char,它也有一个整数表示,在C中它可以隐式转换。 '0'是零字符,数字字符的一个方便特征是它们按整数表示顺序排列。

所以,既然你知道每个字符都有一个整数表示,并且数字字符是按顺序排列的,你可以使用简单的减法将字符转换为整数表示。

'0' - '0' == 0
'1' - '0' == 1
'2' - '0' == 2
/* and so on and so forth */

因此,如果您想计算字符串中数字的出现次数,可以使用此功能:

int n[10]; /* 10 digits */

n['0' - '0'] /* where we store the counts for the character 0, aka n[0] */
n['1' - '0'] /* where we store the counts for the character 1, aka n[1] */

答案 2 :(得分:5)

您可能已经知道,计算机将字符表示为数字。 C标准要求此表示必须确保数字必须相互跟随。因此,如果n是'0'的代码,则n + 9是'9'的代码。对于ASCII,这些值分别为48和57.

您发布的代码示例尝试编码不可知,因此不使用48或57进行检查,而是使用'0'作为便携式常量。

答案 3 :(得分:3)

'0''9'属于int种类型。它们的值分别为48和57(​​因为48和57是字符'0''9'的ASCII值。

所以你可能会在n中保留一个用于计算数字的数组。

所以这个表达式(如果你在c上存储数字字符):

++n[c-'0'];

意思是:

  1. 取n的位置编号c-'0'c包含一个带有数字的字符)
  2. 将该位置增加一个。
  3. 所以n将是:

    n[0] = x; // count of 0 characters
    n[1] = x; // count of 1 characters
    n[2] = x; // count of 2 characters
    n[3] = x; // count of 3 characters
    n[4] = x; // count of 4 characters
    n[5] = x; // count of 5 characters
    n[6] = x; // count of 6 characters
    n[7] = x; // count of 7 characters
    n[8] = x; // count of 8 characters
    n[9] = x; // count of 9 characters
    

    例如,假设c等于字符22的ascii值为50。因此n[50-48]变为n[2]。因此,您最终使用数组n的第三个元素来存储2字符数。

答案 4 :(得分:2)

脱离背景,不可能说为什么作者可能已经这样做了。

代码的作用是将字符'0'循环到'9',可能会将它们与某些用户输入进行比较。在循环体中,为了索引数组0..9,字符将映射到整数n

C中的字符在参与算术时可以表现为整数,通过转换为ASCII整数表示。第一次循环,c0'0' - '0'为整数0,无论'0'的整数值是多少。也就是说,x - x总是等于0;在这种情况下,x的实际值并不重要。

考虑到这一点,以及ASCII值是连续的,从0递增到9这一事实,你可以告诉我c '1'时第二次循环#{ 1}},'1' - '0'是整数1,依此类推。

答案 5 :(得分:2)

'0'表示一个字符值,可以静默转换为整数,结果(通常)是字符'0'的ASCII值(恰好是48)。 if条件验证c是否(可转换为)包含数字的字符值。这是可能的,因为数字0到9分别由ASCII chart中的连续值表示,从48到57。如果从任何数字字符的ASCII值中减去'0'(即48)的ASCII值,则得到该数字的数值(从0到9)。

所以上面的代码索引到一个计数器数组,可能会计算某段文本中每个数字的外观。

答案 6 :(得分:2)

首先,if不是循环,它是一个声明。只有一次通过代码。

这意味着第一行可以读取if c is a digit,第二行将ascii数字转换为整数数字(并增加n数组的元素以计算该数字)。

答案 7 :(得分:1)

因为c是一个字符而不是整数。

“0”的ASCII值为48,因此“{”将是n[c]语句中的索引48,程序员希望“0”为索引0,因为n已定义{{ 1}},所以通过减去'0'的代码将ASCII值转换为等价的整数:n[10]'0' - '0' = 0等。'0'到'9'的ASCII代码是48到57所以转换是合理的。

至于为什么,我猜有人在某些文字中计算数字'0'到'9'的频率。

答案 8 :(得分:1)

这允许使用char作为数组的索引。例如,您可以定义字符串"012345",可能从外部文件中读取,并为每个字符c-'0'计算,这将给出整数01,{{分别为1}},234

答案 9 :(得分:1)

看看ASCII Table,因为它本身可能解释得很好。字符“0”的十进制表示为48,“1”为49,等等。大多数(如果不是所有编译器)都遵循此转换表。

通过减去“0”(很可能是数字48),您实际上将变量c的字符表示形式转换为数字表示。

编辑:正如评论中所提到的,我应该指出'0'或'9'的数字表示不一定遵循ASCII转换表(尽管我相信所有常见的编译器)做)。这是一个技术细节,属于ANSI C规范的讨论,而不是针对某人学习该语言的答案。

如果Ant碰巧写int number = '0';,并想知道为什么它存储数字48,那是因为他的编译器遵循ASCII转换。 这个对于学习C语言基础知识的人来说既有用又有用。给我看一个不这样做的编译器,这不是一些模糊不清的事,我很乐意把它留在那里,但我认为,通常情况下,对于有用的回复而言,这些价值观的价值往往超过了。

也就是说,从不使用实际的数字表示仍然是一件好事。也就是说,总是喜欢在48上写'0'。但很高兴知道为什么'0'最有可能用数字48表示。

答案 10 :(得分:1)

这个(可怕的)代码将数字0..9的ASCII值映射到基于零的索引。 '0'的类型为char,是一种数字类型。 '0'的数值通常为48。从表示数字的48中减去char将为您提供char的“值”。

答案 11 :(得分:1)

-'0' 从给定的一位整数中减去 0(48) 的 ASCII 值(应该只包含 1 位),从 '0' 到 '9' 的数字按顺序存储在 ASCII 码中,因此减去来自给定一位整数的 0 的 ASCII 值将给出整数本身的数值。例如:- '4' 的 ascii 值是 52 从 52 中减去 '0' 的 48 的 ascii 值会给我们数值 4,它等于给定的整数,因此我们使用减法而不是加法+'0' 以及任何其他值的减法或加法也不会导致给定整数的相同数值。

答案 12 :(得分:0)

这是将某事物的ascii值转换为其数字的方法。在C中,char'0'的ascii值为48.因此减去:

'0' - '0' = 0
'1' - '0' = 1
 ...
 c - '0' = <whatever the decimal number of c is>

方便地,ASCII十进制数增量是连续的,否则这个技巧将不起作用。换句话说,c必须是'0'之一...'9'才能使用。这解释了限制:

if(c>='0' && c<='9')