【问题标题】:Can someone explain the " - '0' " [duplicate]有人可以解释“ - '0'” [重复]
【发布时间】:2013-03-20 09:34:17
【问题描述】:
 #include <iostream> // cin, cout
using namespace std;
int main(void)
{
char c[80];
int i, sum=0;
cin.getline(c,80);
for(i=0; c[i]; i++) // c[i] != '\0'
if('0'<=c[i] && c[i]<='9') sum += c[i]-'0';
cout<< "Sum of digits = " << sum << endl;
getchar();
getchar();
return 0;
}

我明白一切都接受 sum += c[i] - '0';我删除了“-'0'”,但它没有给我正确的答案。这是为什么呢?

【问题讨论】:

  • 看看 ASCII 表,你会发现一些有用的东西。
  • 我不会说这是 stackoverflow.com/questions/11098626/understanding-c-0 的完全相同的副本。那是关于'a' - '0',这主要是无意义的巧合,并且与字符集有关。这个问题是关于从'0' 中减去'0' .. '9',我认为这是明确定义的。现在,确实有一些解释普遍适用于这个,但它们是不同的问题。

标签: c++ arrays string


【解决方案1】:

这会将字符从其字符代码(例如 ASCII 中的 48)转换为其等效整数。因此它将字符'0' 转换为整数值0。正如 Pete Becker 在 C 和 C++ 语言定义的评论中指出的那样,要求所有数字字符都是连续的。

【讨论】:

  • 哇,这么多非常详细的错误答案! &lt;g&gt;(如果问题没有关闭,我会将此作为答案发布)它与 ASCII 无关(嗯,不是直接的)。 C 和 C++ 语言定义要求 '0'-'9' 具有连续和升序的值。这使得ch - '0' 工作;否则就不会有简单、健全的机制将代表数字的字符转换为它们所代表的值。它适用于每个有效的字符编码,而不仅仅是 ASCII。
【解决方案2】:

'0' 返回 ASCII 值 0。因此,要使用数字而不是它们的 ASCII 值,您需要偏移 ASCII 值 0。 '1' - '0' ::= 49 - 48 ::= 1(49 和 48 分别是 1 和 0 的 ASCII 值)。

【讨论】:

    【解决方案3】:

    它将一个字符转换为整数值:

    character | ASCII code  | expression | equivalent | result
      '0'     |      48     | '0' - '0'  |  48 - 48   |   0
      '1'     |      49     | '1' - '0'  |  49 - 48   |   1
      '2'     |      50     | '2' - '0'  |  50 - 48   |   2
      '3'     |      51     | '3' - '0'  |  51 - 48   |   3
      '4'     |      52     | '4' - '0'  |  52 - 48   |   4
      '5'     |      53     | '5' - '0'  |  53 - 48   |   5
      '6'     |      54     | '6' - '0'  |  54 - 48   |   6
      '7'     |      55     | '7' - '0'  |  55 - 48   |   7
      '8'     |      56     | '8' - '0'  |  56 - 48   |   8
      '9'     |      57     | '9' - '0'  |  57 - 48   |   9
    

    【讨论】:

      【解决方案4】:

      0 的 ascii 值为 48,1 的 ascii 值为 49,依此类推。现在在你的程序中c[80] 是一个字符数组。因此,如果您从键盘输入 1,编译器会将其视为 49(ascii 值)进行算术运算。这就是为什么我们需要减去 0 的 ascii 值(即 48)来获得等效的整数。这可以通过从字符中减去“0”或直接减去 48 来实现。 例如如果您将sum += c[i]-'0'; 替换为sum += c[i]-48;,该代码也将起作用。但这不是一个好习惯。希望这会有所帮助。

      【讨论】:

        猜你喜欢
        • 2017-11-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-09-21
        • 1970-01-01
        相关资源
        最近更新 更多