代码之家  ›  专栏  ›  技术社区  ›  Sellyme

用“0”减去字符以转换为int是错误的做法吗?

  •  2
  • Sellyme  · 技术社区  · 7 年前

    我希望输入一个一位数的整数,如果不是这样的话,我已经做好了错误处理。通过简单地将输入字符减去“0”以将其“转换”为整数,是否有任何潜在的不可预见的后果?

    我不是在寻找关于可读性或更常用的内容的意见(虽然它们不会影响答案的扩展),而是简单地看它是否是一种可靠的转换形式。如果我要求用户输入一个介于0和9之间的整数,是否有任何情况下可以输入 input = input-'0' 应该 处理,但不处理?

    2 回复  |  直到 7 年前
        1
  •  8
  •   R.. GitHub STOP HELPING ICE    7 年前

    这是安全的,由C语言保证。在当前版本C11中,相关文本为5.2.1字符集,3:

    在源和执行基本字符集中,上述十进制数字列表中0之后的每个字符的值应大于前一个字符的值。

    至于这是否是“糟糕的做法”,这是一个意见问题,但我想说不是。它既有惯用用法(C程序员通常使用和理解),也缺乏任何不令人困惑和效率低下的替代方法。例如,阅读C的人都不想看到它被写成 switch 语句有10个大小写,或通过设置一个伪字符串传递给 atoi .

        2
  •  5
  •   Stephan Lechner    7 年前

    字符的顺序取决于编码/系统,因此通常不能依赖特定的顺序。对于数字序列 0..9 然而,在任何系统中,都保证从 0 并继续 9 没有任何中间字符。所以 input = input - '0' 只要你保证 input 包含数字(例如,通过使用 isdigit ).