Пожалуйста, объясните, что делает этот код (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.

удачи!