2013-03-20 2 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

+0

Я бы не сказал, что это точный дубликат http://stackoverflow.com/questions/11098626/understanding-c-0. Это о '' a '-' 0'', что в большинстве своем является бессмысленным совпадением и зависит от характера. Этот вопрос заключается в вычитании '' 0'' из ''0'' ..' '9'', который, я считаю, четко определен. Теперь верно, что некоторые объяснения там, как правило, применимы к этому, но они разные вопросы. – jamesdlin

ответ

10

Это преобразует символ из его символьного кода (например, 48 в ASCII) в его целочисленный эквивалент. Таким образом, он превращает символ '0' в значение 0 как целое. Как отметил Пит Беккер в комментарии в определениях языков как C, так и C++, требуется, чтобы все числовые символы были последовательными.

+0

Ничего себе, так много очень подробных ** неправильных ** ответов! '' (я бы разместил это как ответ, если вопрос не был закрыт). Это не имеет никакого отношения к ASCII (ну, а не напрямую). Определения языка C и C++ ** требуют ** того, что '' 0''-''9'' имеют значения, которые являются смежными и восходящими. Это делает работу 'ch - '0''; в противном случае не было бы простого, разумного механизма для преобразования символов, которые представляют цифры в значения, которые они представляют. Он работает для ** каждого ** действительного кодирования символов, а не только ASCII. –

1

«0» возвращает значение ASCII равным 0. Поэтому для использования чисел, а не их значений ASCII, необходимо компенсировать значение ASCII 0. '1' - '0' :: = 49 - 48 :: = 1 (49 и 48 соответственно являются значениями ASCII для 1 и 0).

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

Значение ASCII для 0 48, 1 49-и так далее. Теперь в вашей программе c[80] - это массив символов. Поэтому, если вы вводите 1 с клавиатуры, компилятор рассматривает это как 49 (значение ascii) для арифметической операции. Вот почему нам нужно вычесть значение ascii 0 (например, 48), чтобы получить целочисленный эквивалент. это может быть достигнуто либо путем вычитания «0» из символа, либо путем вычитания 48 напрямую. , например. если вы замените sum += c[i]-'0'; на sum += c[i]-48;, код также будет работать. Но это не очень хорошая практика. Надеюсь это поможет.

Смежные вопросы