有人可以解释为什么这有效吗?
char c = '9';
int x = (int)(c - '0');
Run Code Online (Sandbox Code Playgroud)
为什么从char的ascii代码中减去'0'会导致char表示的数字?
Jea*_*ean 34
因为char都用数字表示,'0'是第一个.
在下表中,您会看到:
'0' => 48
'1' => 49
'9' => 57.
Run Code Online (Sandbox Code Playgroud)
其结果是:('9'- '0')=(57 - 48)= 9
资料来源:http://www.asciitable.com
Jos*_*eld 22
char是一个整数类型,就像int和家人一样.类型的对象char具有一些数值.您在字符文字(如'0')中键入的字符与char对象所具有的值之间的映射由执行字符集中该字符的编码决定:
C++11§2.14.3:
包含在执行字符集中可表示的单个c-char的普通字符文字具有类型
char,其值等于执行字符集中的c-char的编码的数值.
C99§6.4.4.4:
整数字符常量是用单引号括起来的一个或多个多字节字符的序列,如
'x'.[...]
整数字符常量具有类型
int.
请注意,int可以转换为char.
执行字符集的选择取决于实现.通常,选择是ASCII兼容的,因此在其他答案中发布的表格具有适当的值.但是,字符集不需要与ASCII兼容.但是有一些限制.其中之一如下(C++11§2.3,C99§5.2.1):
Run Code Online (Sandbox Code Playgroud)a b c d e f g h i j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 0 1 2 3 4 5 6 7 8 9 _ { } [ ] # ( ) < > % : ; . ? * + - / ^ & | ~ ! = , \ " ’[...]
在源和执行基本字符集中,上述十进制数字列表中0之后的每个字符的值应比前一个值大1.
这意味着无论角色'0'具有什么价值,角色的'1'价值都会超过一个'0',而角色的'2'价值就会超过一个,依此类推.数字字符具有连续值.您可以这样总结映射:
Character: 0 1 2 3 4 5 6 7 8 9
Corresponding value: X X+1 X+2 X+3 X+4 X+5 X+6 X+7 X+8 X+9
Run Code Online (Sandbox Code Playgroud)
所有数字字符都具有偏移值的值'0'.
这意味着,如果您有一个字符,让我们说'9'并'0'从中减去,您将获得执行字符集中值'9'和值之间的"距离" '0'.因为它们是连续的,所以距离将是9.
小智 19
因为C标准保证字符0, 1, 2, 3, 4, 5, 6, 7, 8, 9始终按照其数字字符代码的顺序排列.所以,如果你'0'从另一个数字中减去char代码,它将给出它相对于它的位置0,这就是它的价值......
从C标准,第5.2.1节字符集:
在源和执行基本字符集中,上述小数位数列表中0之后的每个字符的值应大于前一个值的值.
因为,文字是按顺序排列的.
因此,如果0是48,1将是49,2将是50等在ASCII中,那么x将包含,ascii值'9'减去ascii值,'0'这意味着,ascii值'9'将是57,因此,x将包含57 - 48 = 9.
此外,char是一个整体类型.