将 char 减去“0”以转换为 int 不好的做法吗?
Is subtracting a char by '0' to convert to int bad practice?
我希望输入的是个位数的整数,如果不是这种情况,我已经进行了错误处理。将输入的字符简单地减去'0'到"convert"成一个整数是否有任何潜在的不可预见的后果?
我不是在寻找关于可读性或更常用的东西的意见(尽管作为答案的扩展它们不会受到伤害),而是在寻找它是否是一种可靠的转换形式。如果我要求用户输入一个介于 0 和 9 之间的整数,是否有任何情况下可以输入 input = input-'0'
应该 处理,但不处理?
字符的顺序是encoding/system-dependent,所以一般不能依赖于特定的顺序。然而,对于任何系统中的数字序列 0..9
,都保证它以 0
开始并继续到 9
,没有任何中间字符。所以 input = input - '0'
是完美的,只要你保证 input
包含一个数字(例如通过使用 isdigit
)。
这是安全的,C语言有保障。在当前版本 C11 中,相关文本为 5.2.1 字符集,¶3:
In both the source and execution basic character sets, the value of each character after 0 in the above list of decimal digits shall be one greater than the value of the previous.
至于是不是"bad practice",见仁见智,我认为不是。它既是惯用的(被 C 程序员普遍使用和理解),又没有任何不会混淆和低效的替代方法。例如,没有人阅读 C 语言会希望看到它被写成一个包含 10 个案例的 switch
语句,或者通过设置一个虚拟的单字符字符串传递给 atoi
.
我希望输入的是个位数的整数,如果不是这种情况,我已经进行了错误处理。将输入的字符简单地减去'0'到"convert"成一个整数是否有任何潜在的不可预见的后果?
我不是在寻找关于可读性或更常用的东西的意见(尽管作为答案的扩展它们不会受到伤害),而是在寻找它是否是一种可靠的转换形式。如果我要求用户输入一个介于 0 和 9 之间的整数,是否有任何情况下可以输入 input = input-'0'
应该 处理,但不处理?
字符的顺序是encoding/system-dependent,所以一般不能依赖于特定的顺序。然而,对于任何系统中的数字序列 0..9
,都保证它以 0
开始并继续到 9
,没有任何中间字符。所以 input = input - '0'
是完美的,只要你保证 input
包含一个数字(例如通过使用 isdigit
)。
这是安全的,C语言有保障。在当前版本 C11 中,相关文本为 5.2.1 字符集,¶3:
In both the source and execution basic character sets, the value of each character after 0 in the above list of decimal digits shall be one greater than the value of the previous.
至于是不是"bad practice",见仁见智,我认为不是。它既是惯用的(被 C 程序员普遍使用和理解),又没有任何不会混淆和低效的替代方法。例如,没有人阅读 C 语言会希望看到它被写成一个包含 10 个案例的 switch
语句,或者通过设置一个虚拟的单字符字符串传递给 atoi
.