在this page上,C#的示例代码包含以下代码,其中cardNumber是一个字符串:
cardNumber.Select(c => c - '0').ToArray()
现在,这看起来要做的是从cardNumber中的每个char中减去0,将每个char作为int返回,然后将它们放入一个数组中。我的问题,特别是关于此代码的c - '0'
部分的问题是:
1)为什么这样做?什么是潜在的行为/解释?
2)为什么要这样做而不是使用Int32.Parse?
注意:Here is a similar question in C,此问题可能有相同/类似的解释。
答案 0 :(得分:5)
它减去unicode代码点。因此,如果c
类似9
,则操作为'9' - '0'
。 9
的代码点为57
,0
的代码点为48
,因此会执行57 - 48
,结果为9
。
我能想到在int.Parse
上执行此操作的唯一原因是速度 - 这是一个比int.Parse
更快的算术运算。
答案 1 :(得分:1)
每个字符都有一个数字表示,因此它可以存储在内存中,而c - '0'
操作只是从代表{{1}所持字符的数字中减去代表'0'
的数字。 }。
因此,如果c
持有c
,则操作的结果将是数字'5'
。
以下是ASCII可打印代码图表的快速参考,Unicode向后兼容:
5
答案 2 :(得分:1)
Dave Zych在answer中指出的是绝对正确的。这会将字符串转换为数字数组。
您经常会在嵌入式系统上看到这样的事情,其中解析int
是一项昂贵的操作。这种方法存在一个重大缺陷。 (除此之外,对于不熟悉的人来说,它并不是很明显。)
考虑以下输入字符串会发生什么:
اختبار
结果数组出现
{ 1527, 1534, 1530, 1528, 1527, 1537 }
使用此方法时失败是因为اختبار
与123456
一样有效。使用int.Parse
虽然速度可能较慢,但会抛出一个FormatException
来告诉您出现问题。
虽然在某些情况下使用c - '0'
方法肯定是可以接受的,但只要确保在使用它时您了解风险,并确保测试边缘情况。
(对于任何对阿拉伯语感兴趣并且使用Google翻译进行测试的人来说)