使用n 的真正用途是什么?

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

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

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

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

鉴于任何人都可以说我,这个arrays的真正用途是什么,有什么缺点呢?

提前致谢。

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

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

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] */ 

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

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

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

所以你可能会在数组中保存数字。

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

 ++n[c-'0']; 

手段:

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

所以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字符数。

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

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

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

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

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

鉴于此,以及ASCII值是连续的,从0递增到9的事实,你可以告诉第二次通过循环时c将为'1''1' - '0'是整数1 ,并且等等。

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

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

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

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

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

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

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

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

通过减去’0’(很可能是数字48),您基本上将变量c的字符表示forms转换为数字表示。

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

如果Ant碰巧写入int number = '0'; ,并想知道为什么它存储数字48,这是因为他的编译器遵循ASCII转换。 对于学习C语言基础知识的人来说既有用又有帮助。给我看一个没有做到这一点的编译器,这不是一些晦涩难懂的事情,我很乐意将它留在那里,但我认为比不是因为有用的回复而贬值。

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

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

 '0' - '0' = 0 '1' - '0' = 1 ... c - '0' =  

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

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