【问题标题】:Why does adding a '0' to an int digit allow conversion to a char?为什么将“0”添加到 int 数字允许转换为 char?
【发布时间】:2014-08-16 19:31:56
【问题描述】:

我到处都看到过这样的例子:

int i = 2;
char c = i + '0';
string s;
s += char(i + '0');

但是,我还没有看到为什么添加零可以进行转换的解释。

【问题讨论】:

  • c++ 中的char(i + '0'); 是什么? (这是一个实际问题。
  • @this 它在 topcoder 上编译:/
  • @this,它是整数 i 加上 '0' 提升为整数,结果被转换为具有函数样式转换的 char,其作用与 C 相同-风格的演员。
  • 这些答案没有提到的是完全允许字符集不兼容 ASCII。但是,如果发生这种情况,这仍然适用于i∈[0, 9],因为数字字符的字符代码保证是连续的。如果您想要一个不兼容 ASCII 的字符集示例,请查看 EBCDIC。数字'0'-'9'的字符代码分别为240-249。

标签: c++ char int type-conversion


【解决方案1】:

(char)(i+c) 其中cchar 为您提供一个新的char,其ascii 值等于(ascii 值c)+i。由于数字 0-9 的 ascii 值是连续的,i+'0' 会为您提供与i 对应的字符,只要i 在适当的范围内。

编辑:(i+c) 是一个 int,正如 Jarod42 指出的那样。添加了演员表以保持正确性。

【讨论】:

  • C++ 实现不需要使用 ASCII。将 0 添加到 0 到 9 的值是可行的,因为 C 标准要求 '0''9' 的字符代码在 [lex.charset] 中是连续的。
【解决方案2】:

如果您查看 ASCII 表 asciitable,您会看到数字从 48(即“0”)开始到 57(即“9”)。所以为了得到一个数字的字符代码,你可以将该数字添加到字符代码'0'中。

【讨论】:

  • C++ 实现不需要使用 ASCII。将 0 添加到 0 到 9 的值是可行的,因为 C 标准要求 '0''9' 的字符代码在 [lex.charset] 中是连续的。
【解决方案3】:

它基于 ASCII 值。添加 ASCII 值 0 即 48 意味着 48 + 5 将是 53 或 ASCII 53 即 5。

谷歌 ASCII 并找到一个好的图表并研究它。一旦您查看每个 char(字符)的值,这应该是有意义的。

【讨论】:

  • C++ 实现不需要使用 ASCII。将 0 添加到 0 到 9 的值是可行的,因为 C 标准要求 '0''9' 的字符代码在 [lex.charset] 中是连续的。
【解决方案4】:

使用ASCII编码时,'0'的整数值为48

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

...

'0' + 9 = 57 = '9'

所以,如果您想将一个数字转换为对应的字符,只需在其中添加'0'

即使平台使用非 ASCII 编码,语言仍然保证字符 '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

当使用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

因此,无论平台使用何种字符编码,这些行

int i = 2;
char c = i + '0';

将始终导致c 的值等于字符'2'

【讨论】:

    【解决方案5】:

    char 会根据 ASCII 值将整数转换为对应的值,所以如果你给一个 char 赋值 48 它将存储 0,因为 48 是 0 的 ASCII 值。相应地你添加 0 的 ASCII 值任何你需要转换为字符的整数

    【讨论】:

    • 这如何为已经存在的答案添加任何内容?无论如何,这并不完全正确。如果将值 48 分配给 char,它将存储 48(即 '0' 在 char 变量中)。它不会存储 0,因为 0 != 48。
    • C++ 实现不需要使用 ASCII。将 0 添加到 0 到 9 的值是可行的,因为 C 标准要求 '0''9' 的字符代码在 [lex.charset] 中是连续的。
    【解决方案6】:

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

    因此'1'的值为'0'+1'2'的值为'0'+2,以此类推。如果n 的值介于0 到9 之间,则'0'+n 是从'0''9' 的对应字符的值。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-12-02
      • 1970-01-01
      • 2013-04-23
      • 2013-06-24
      • 1970-01-01
      • 2017-05-12
      • 2018-11-29
      • 1970-01-01
      相关资源
      最近更新 更多