使用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'];
手段:
- 取n的位置编号
c-'0'
(c
包含一个带有数字的字符) - 将该位置增加一个。
所以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
等于字符2
。 2
的ascii值是50
。 所以n[50-48]
变成n[2]
。 所以你最终使用数组n
第三个元素来存储2
字符数。
首先, if
不是循环,那么它就是一个声明。 只有一次通过代码。
这意味着if c is a digit
,第一行可以读取,第二行可以将ascii数字转换为整数数字(并且增加n数组的元素以计算该数字)。
脱离背景,不可能说作者为什么会这样做。
代码所做的是将字符'0'
循环到'9'
,可能将它们与某些用户输入进行比较。 在循环体期间,为了索引数组n
,字符被映射到整数0..9
。
通过转换为ASCII整数表示,C中的字符在参与算术时可以表现为整数。 第一次通过循环, c
为0
,并且'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'
,它们将分别给出整数0
和5
。
这个(可怕的)代码将数字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')