Пожалуйста, объясните, что делает этот код (someChar-48)
Я прохожу через некоторые практические проблемы, и я видел этот код:
#include <stdio.h>
#include <string.h>
int main(void) {
char* s = "357";
int sum = 0;
int i = 0;
for (i = 0; i < strlen(s); i++) {
sum += s[i] - 48;
}
printf("Sum is %d", sum);
return 0;
}
может кто-нибудь объяснить, что делает код, особенно вычитание с 48 частью?
4 ответов
код в основном суммирует цифры числа, представленного в виде строки. Он делает два важных предположения для правильной работы:
- строка содержит только символы в
'0'..'9'
ряд - используется кодировка символов ASCII
в ASCII, '0' == 48
, '1' == 49
и так далее. Таким образом, '0' - 48 == 0
, '1' - 48 == 1
и так далее. То есть вычитание на 48 переводит char
значения '0'..'9'
до int
значения 0..9
.
таким образом, именно потому, что '0' == 48
, код также будет работать с:
sum += s[i] - '0';
намерение, возможно, немного более ясно в этой версии.
вы можете, конечно, сделать" обратное " отображение путем добавления, например 5 + '0' == '5'
. Аналогично, если у вас есть char
содержащий письмо в 'A'..'Z'
диапазон, вы можете "вычесть"'A'
от него, чтобы получить индекс этой буквы в
Поиск суммы чисел в строке s.
на sum += s[i] - 48;
преобразует символы ASCII в их числовые значения.
его сложение 3 + 5 + 7, а затем печать
сумма 15
на -48
часть заключается в том, что она вычитает символ 0, то есть значение ascii для 0.
Итак, что он делает, это
'3' - '0' > 51 - 48
'5' - '0' > 53 - 48
'7' - '0' > 55 - 48
Как вы можете видеть, в C '0' (нулевой символ) отличается от 0 (число 0). Они имеют разные значения (среди прочего)
Я предлагаю написать тестовую программу, чтобы увидеть, что значения s[] дисплей. Вы также можете распечатать все значения для каждой записи в "0123456789".
Я думаю, вы быстро поймете, что он делает, хотя этот код полагается на кодировку ASCII.
удачи!