此方法适用于C,C ++和Java。我想知道它背后的科学。
答案 0 :(得分:23)
char
的值可以是0-255,其中不同的字符映射到这些值之一。数字也按'0'
到'9'
的顺序存储,但它们通常也不会存储为前十个char
值。也就是说,字符'0'
的ASCII值不是0
。 0
的char值几乎总是\0
null字符。
在不了解ASCII的任何其他内容的情况下,如何从任何其他数字字符中减去'0'
字符将导致原始字符的char值非常简单。
所以,这是简单的数学:
'0' - '0' = 0 // Char value of character 0 minus char value of character 0
// In ASCII, that is equivalent to this:
48 - 48 = 0 // '0' has a value of 48 on ASCII chart
因此,类似地,我可以使用任何char
数字进行整数运算...
(('3' - '0') + ('5' - '0') - ('2' - '0')) + '0') = '6'
ASCII图表上的3
,5
或2
和0
之间的差异与我们在看到数字时通常会想到的面值完全相同数字。从每个中减去char '0'
,将它们加在一起,然后在最后添加'0'
将给我们一个char值,表示执行该简单数学运算的结果的char。
上面的代码片段模拟3 + 5 - 2
,但在ASCII中,它实际上是这样做的:
((51 - 48) + (53 - 48) - (50 - 48)) + 48) = 54
因为在ASCII图表上:
0 = 48
2 = 50
3 = 51
5 = 53
6 = 54
答案 1 :(得分:4)
在C中,+
和-
运算符将整数提升 * 1 应用于它们的参数,从而减去(或添加)两个char
s的结果是int
* 2 。
来自C标准:
5.1.2.3程序执行
[...]
10示例2执行片段
char c1, c2; /* ... */ c1 = c1 + c2;
'整数促销''要求抽象机器将每个变量的值提升为
int
大小,然后添加两个int
s [...]
将此应用于OP隐式给出的
用例char c = 42;
... = c - `0`;
这将导致上述内容与:
相同... = (int) c - (int) `0`; /* The second cast is redundant, as per Jens' comment. */
^ ^
+------ int -----+
* 1:如果运算符参数的排名低于int
,则会将其提升为int
。
* 2:char
的排名低于int
。
答案 2 :(得分:2)
没有变化。 '0'
是C 中的int。编写48
(假设为ASCII)是一种奇特的方式。
您可以通过计算'0'
:
printf ("sizeof '0' is %zu\n", sizeof '0');
printf ("sizeof(char) is %zu\n", sizeof(char));
在第一行很可能会打印4(或2),但可能不会像第二行那样打印(再次:在C中;对于C ++来说是不同的。)
答案 3 :(得分:0)
没有任何限定条件的数字常量0
的类型为int
。由于通常的类型提升过程,char
和int
上的二进制减法操作的结果也具有类型int
。