char 0减去什么呢?

时间:2015-10-15 22:18:12

标签: c#

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,此问题可能有相同/类似的解释。

3 个答案:

答案 0 :(得分:5)

它减去unicode代码点。因此,如果c类似9,则操作为'9' - '0'9的代码点为570的代码点为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翻译进行测试的人来说)

相关问题