2013-03-20 241 views
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; 
} 

我明白一切接受总和+ = c [i] - '0';我删除了“-'0'”,但没有给我正确的答案。为什么是这样?有人可以解释“ - '0'”

+4

看看ASCII表格,你会发现一些有用的东西。 – billz 2013-03-20 09:35:32

+0

我不会说这是http://stackoverflow.com/questions/11098626/understanding-c-0的确切副本。那个是关于''a' - '0'的,这大部分都是无意义的巧合,并且是与字符集相关的。这个问题是关于从“0”减去“0”,我相信它是明确定义的。现在,其中一些解释通常适用于这一个,但他们是不同的问题。 – jamesdlin 2013-03-20 10:25:31

回答

10

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

+0

哇,这么多非常详细的**错误**答案! ''(如果问题没有被关闭,我会发布这个答案)它与ASCII无关(好吧,不是直接的)。 C和C++语言定义**要求**''''''''''具有连续和递增的值。这使'ch''0''工作;否则就没有简单,理智的机制可以将表示数字的字符转换为它们表示的值。它适用于**每个有效的字符编码,而不仅仅是ASCII。 – 2013-03-20 11:22:47

1

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

0

它的字符转换为整数值:

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的ASCII值是48,对于其1 49等。现在在你的程序c[80]是一个字符数组。因此,如果您从键盘输入1,编译器会将其视为算术运算的49(ascii值)。这就是为什么我们需要减去0的ascii值(即48)来获得等效的整数。这可以通过从角色中减去'0'或者直接减去48来实现。 例如如果你用sum += c[i]-48;代替sum += c[i]-'0';,代码也可以工作。但这不是一个好的做法。希望这可以帮助。