我是C的新手,我遇到了这样的代码:
int n[10];
if(c>='0' && c<='9')
++n[c-'0']
在if
循环中为什么我们必须在0
周围使用单引号,使用它是什么,为什么我们不能立即将0
定义为整数?在第二行代码++n[c-'0']
中,使用像这样的数组是什么意思,为什么我们需要减去0
(再次为什么在这个上下文中使用单引号?)来自{数组索引中的{1}}?
如果我喜欢这个c
,索引操作(n[c-'0']
)的结果将是一个字符还是整数?
鉴于任何人都可以说我,这个阵列的实际用途是什么,有什么缺点呢?
提前致谢。
答案 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'];
意思是:
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
字符数。
答案 4 :(得分:2)
脱离背景,不可能说为什么作者可能已经这样做了。
代码的作用是将字符'0'
循环到'9'
,可能会将它们与某些用户输入进行比较。在循环体中,为了索引数组0..9
,字符将映射到整数n
。
C中的字符在参与算术时可以表现为整数,通过转换为ASCII整数表示。第一次循环,c
为0
,'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'
计算,这将给出整数0
,1
,{{分别为1}},2
,3
和4
。
答案 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')