Код в основном суммирует цифры числа, представленные в виде строки. Это делает два важных предположения для правильной работы:
- Строка содержит только символы в диапазоне
'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'
, чтобы получить индекс этой буквы в диапазоне 0..25
.
Смотри также
Похожие вопросы
Об альтернативных кодировках
Как уже упоминалось, исходный код - 48
предполагает, что используется кодировка символов ASCII. - '0'
не только улучшает удобочитаемость, но и отменяет допущение ASCII и будет работать с любым кодированием , как указано языком C, который предусматривает, что цифровые символы должны кодироваться последовательно в непрерывном блоке.
С другой стороны, в отношении писем такого положения не предусмотрено. Таким образом, в редкой ситуации, когда вы используете, например, кодировку EBCDIC, отображение 'A'..'Z'
в 0..25
уже не так просто, как вычитание 'A'
, из-за того, что буквы NOT кодируется последовательно в непрерывном блоке в EBCDIC.
Некоторые языки программирования упрощают работу, поскольку для представления исходного кода используется одна конкретная кодировка (например, Java использует Unicode: JLS §3.1 )
Смотри также
Смежные вопросы