Перевод char в int. Зачем " -'0' "?
Внимание! Это довольно старый топик, посты в него не попадут в новые, и их никто не увидит. Пишите пост, если хотите просто дополнить топик, а чтобы задать новый вопрос — начните новый.
Внимание! Это довольно старый топик, посты в него не попадут в новые, и их никто не увидит. Пишите пост, если хотите просто дополнить топик, а чтобы задать новый вопрос — начните новый.
Решаю задачи на acmp. Суть этой была в том чтобы складывать цифры числа, а затем если полученное числа больше 9, то есть не однозначное, складывать снова до тех пор пока не получится однозначное. Но не суть. Час убил на это, понаписал кучу всего, но потом нашел этот код. Собственно он вполне рабочий, но некоторый моменты мне непонятны.
Буду благодарен, если кто-то поможет разобраться.
Вот код:
MG000, по порядку:
1).
char
можно всегда неявно преобразовывать вint
, поскольку оба этих типа представляют целое число со знаком, но диапазон значенийint
не меньше диапазона значенийchar
. Это во-первых.Во-вторых,
char
может интерпретироваться [программистом] либо как число со знаком (аналогичноint
,long int
, etc.), либо как символ (буква, цифра и т.п.), представленный семи- или восьмибитным кодом (например по таблице ASCII), т.е. в этом случае переменная типаchar
содержит код символа.В-третьих, функция
atoi
принимает неchar
, аconst char *
, т.е. константный указатель на массив значений типаchar
, проще говоря, константный указатель на С-строку (не путать сstd::string
из STL!).2). Это перевод цифры в число. Учитывая то, что в массиве
char str[1001]
содержатся ASCII-коды символов и то, что коды для цифр (символов) 0, 1, ..., 9 в таблице ASCII идут непрерывным блоком в том же порядке, можно делать преобразование из кода символа в число вычитая из кода цифры код цифры 0. Например,'5' - '0'
для компилятора будет значить0x35 - 0x30
(код цифры 5 минус код цифры 0), что даст число 5. Результат будет также типаchar
, как и исходные операнды.3). С-строка заканчивается нулевым символом (
'\0'
). В условном выражении 0 соответствуетfalse
, все остальные значения —true
. Поэтому оператор можно переписать в формеfor (i = 0; str[i] != '\0'; ++i)
. Т.е. цикл будет продолжаться пока не будет достигнут конец строки.Cranium, большое спасибо за помощь! Теперь все понятно.