Это должно ответить на ваш вопрос:
char c = 'a';
std::cout << int(c) << " "<< int('0') << " " << c - '0' << std::endl;
, если вы запустите его, вывод будет 97 48 49
, потому что 97 -> 'a'
48 -> '0'
и так 49 -> '0'
, который также можно записать как 97 - 48 -> '0'
.
Символы под капотом являются целыми числами, и поэтому вы можете go через них с помощью арифметического c оператора. (отметьте this ).
Это означает, что если у вас есть string
или char *
и вы хотите считать все вхождения каждого символа, вы должны использовать
int duplicates[256];
duplicates[c]++;
потому что, например, если по какой-то причине ваша строка равна "\1"
, и вы делаете duplicates[c-'0']++;
, индекс массива будет отрицательным числом и, следовательно, неопределенным поведением (при условии, что вы не выполняете никаких проверок до приращений, например, проверка, находится ли внутри заданной границы c)