数组K&R 1.6字符?
在第23页的K&R第二版中,有一些代码
if (c >= '0' && c <= '9') ++ndigit[c-'0'];
它继续。 我的问题是,为什么整数都有’在每一边? 什么是c-‘0’?
代码的目的是将字符 '0'...'9'
转换为相应的整数值0...9
。 C不保证表示十进制数字的字符具有任何特定值,但它确保它们是连续的并且顺序正确。 上面的减法将始终为您提供正确的整数值。
C中的任何其他角色都没有类似的保证。
参考
ISO 9899:1999标准(又名C99)说:
执行字符集的成员值是实现定义的。 …
所有位都设置为0的字节,称为空字符,应存在于基本执行字符集中; 它用于终止字符串。 …
上述十进制数字列表中0后的每个字符的值应大于前一个值。
在N1570中找到了完全相同的措辞,这是当前标准(C11)的最终公开草案。
关于角色的价值或关系,没有其他说法。
'0'
是一个角色。 它具有整数值48.’9 '9'
具有值57.c c - '0'
值等于c - 48
,并且将是相应字符的整数值。 '0'
将为0
, '1'
将为1
,等等。
'0'
是一个char
,即一个字符。 每个字符在内部由整数表示。 请参阅ASCII 。 例如, '0'
具有整数值48
。