有人能解释一下 " - '0' " 吗?

4
 #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'”,但它没有给出正确的答案。为什么呢?


4
查看ASCII表,你会发现一些有用的东西。 - billz
我不会说这是 http://stackoverflow.com/questions/11098626/understanding-c-0 的完全重复。那个问题是关于 'a' - '0',这主要是无意义的巧合,并且与字符集有关。而这个问题是关于从 '0''9' 中减去 '0',我相信这是明确定义的。现在,确实有一些解释适用于这个问题,但它们是不同的问题。 - jamesdlin
4个回答

10

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


哇,这么多高度详细的错误答案!<g>(如果问题没有关闭,我会将其发布为答案)它与ASCII无关(好吧,不是直接相关)。C和C++语言定义要求'0'-'9'具有连续且递增的值。这使得ch - '0'有效;否则,就没有简单、合理的机制将表示数字的字符转换为它们所代表的值。它适用于每个有效的字符编码,而不仅仅是ASCII。 - Pete Becker

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

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

1

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


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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接