数组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