Разница между int (c) и c - '0'. C ++ - PullRequest
0 голосов
/ 26 февраля 2020

Рассмотрим следующий фрагмент кода:

char c = 'a';
std::cout << int(c) << " " << c - '0' << std::endl;

Здесь мой вывод 97 49.

Может кто-нибудь намекнуть мне, в чем разница между ними?
Например, если я я пытаюсь найти количество повторяющихся символов в строке:

int duplicates[256];
//.. run over string
1. duplicates[c]++;
2. duplicates[c-'0']++;

Так какой же мне выбрать и в чем разница между ними?
Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 26 февраля 2020

Число ноль и символ «0» - это две совершенно разные вещи. Единственное, что у них общего, так это то, что символ «0» иногда используется как способ представления числа ноль.

std::cout << int(c) << " " << c - '0' << std::endl;

Это вычитает любой код, используемый вашей платформой для представления символа «0». Почти наверняка это не число ноль.

0 голосов
/ 26 февраля 2020

Это должно ответить на ваш вопрос:

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)

...