【问题标题】:Arrays K&R 1.6 chars?数组 K&R 1.6 字符?
【发布时间】:2014-04-05 20:13:07
【问题描述】:

在K&R第二版的第23页,有一些代码

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

继续。我的问题是,为什么整数两边都有'? 什么是 c-'0'?

【问题讨论】:

  • 0'0' 不同。
  • 是的,但是这本书在解释它们方面做得很差。或者,也许我只是在理解它们方面做得很差:/
  • 检查c的值是否为数字的ascii码
  • 您到了第 23 页却不知道为什么字符文字周围有单引号?返回第 1 页并重新开始阅读。

标签: c arrays char integer


【解决方案1】:

'0' 是一个字符。它的整数值是 48。'9' 的值是 57。c - '0' 的值等于 c - 48,并且将是相应字符的整数值。 '0' 将是 0'1' 将是 1,等等。

【讨论】:

  • 所以你可以很容易地使用 0 和 9 来代替相同的目的吗?因为 ASCII 0-9 从 48 开始,对于 9 上升到 57,并且代码正在查找 c 是否为 '0'to'9' 但它只能找到 0 到 9?
  • @Erik:“它的整数值为 48”很可能是真的,但不一定如此。
  • @OVER9000:不,因为 0 和 9 的整数值是 0 和 9,而不是 48 和 57 ;)
  • @NisseEngström:K&R。第 2 版。从 1988 年开始。是的,必然如此;)(好吧,不一定,但出于所有实际目的)。
【解决方案2】:

代码的目的是将字符 '0'...'9' 转换为对应的整数0...9。 C 确实保证表示十进制数字的字符具有任何特定值,但它确实保证它们是连续的并且顺序正确。上面的减法总是会给你正确的整数值。

C 中的任何其他字符都没有类似的保证。

参考文献

ISO 9899:1999 标准(又名 C99)说:

执行字符集成员的值是实现定义的。 ...

一个所有位都设置为0的字节,称为空字符,应该存在于基本执行字符集中;它用于终止一个字符串。 ...

上述十进制数字列表中0后的每个字符的值应比前一个字符的值大一。

N1570 中的措辞完全相同,这是当前标准 (C11) 的最终公开草案。

关于角色的价值或角色之间的关系,没有太多其他说明。

【讨论】:

    【解决方案3】:

    '0' 是一个char,即一个字符。每个字符在内部由一个整数表示。见ASCII。例如,'0' 具有整数值 48

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-12-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-14
      • 2023-03-24
      • 1970-01-01
      相关资源
      最近更新 更多