为什么在int数字中添加'0'允许转换为char?

sga*_*a62 9 c++ int type-conversion char

我已经看到了这个地方的例子:

int i = 2;
char c = i + '0';
string s;
s += char(i + '0');
Run Code Online (Sandbox Code Playgroud)

但是,我还没有看到为什么添加零允许转换的原因.

tri*_*e_r 10

如果您查看ASCII表,ascitable,您会看到数字从48开始(为'0')并且最多为57(对于'9').因此,为了获得数字的字符代码,您可以将该数字添加到字符代码"0".

  • C++ 实现不需要使用 ASCII。将“0”添加到从 0 到 9 的值是有效的,因为 C 标准要求“0”到“9”的字符代码在 [lex.charset] 中是连续的。 (3认同)

R S*_*ahu 5

当使用ASCII编码的整数值'0'48

'0' + 1 = 49 = '1'
'0' + 2 = 50 = '2'

...

'0' + 9 = 57 = '9'
Run Code Online (Sandbox Code Playgroud)

因此,如果要将数字转换为相应的字符,只需将'0'其添加。

即使洗车台使用非ASCII编码,则lanuage仍然保证了角色'0'- '9'必须编码这样的:

'1' - '0' = 1
'2' - '0' = 2
'3' - '0' = 3
'4' - '0' = 4
'5' - '0' = 5
'6' - '0' = 6
'7' - '0' = 7
'8' - '0' = 8
'9' - '0' = 9
Run Code Online (Sandbox Code Playgroud)

当使用ASCII编码时,将变为:

'1' - '0' = 49 - 48 = 1
'2' - '0' = 50 - 48 = 2
'3' - '0' = 51 - 48 = 3
'4' - '0' = 52 - 48 = 4
'5' - '0' = 53 - 48 = 5
'6' - '0' = 54 - 48 = 6
'7' - '0' = 55 - 48 = 7
'8' - '0' = 56 - 48 = 8
'9' - '0' = 57 - 48 = 9
Run Code Online (Sandbox Code Playgroud)

因此,无论平台使用哪种字符编码,

int i = 2;
char c = i + '0';
Run Code Online (Sandbox Code Playgroud)

总是会导致c等于字符的值'2'


Eri*_*hil 5

C++ 标准规定,在其 [lex.charset] 部分 \xe2\x80\x9c 中,上述十进制数字列表中 0 之后的每个字符的值应比前一个 \xe2\x80\x9d 的值大 1(引用)摘自 N4659 草案)。

\n\n

因此, 的值'1'是 ' 0'+1, 的值'2'比 ' 多 1,即'0'+2,依此类推。如果n值为 0 到 9,则是从到 的'0'+n对应字符的值。'0''9'

\n\n

(与之前的答案不同,此答案不假定 ASCII,并显示该属性如何从 C++ 标准派生。)

\n