В C символьный литерал имеет тип int. [символьные литералы/IBM]
В вашем примере числовое значение '0' равно 48, числовое значение '2' равно 50. Когда вы делаете '2' - '0', вы получаете 50 - 48 = 2. Это работает для чисел ASCII от 0 до 9.
См. таблицу ASCII, чтобы получить более полное представление.
Изменить: Спасибо @ouah за исправление.
Ответ 2 · рейтинг 3 · Luke Morgan
Все символы в C представлены целочисленным значением, кодом ASCII символа. Например, "0" соответствует 48, а "2" соответствует 50, поэтому '2'-'0' дает вам 50-48 = 2
Когда вы используете запятые ' ', вы обрабатываете число как char, и если оно задано как int, то int примет значение ASCII-кода этого символа.
Ответ 4 · рейтинг 2 · Blagovest Buyukliev
Любой символьный литерал, заключенный в одинарные кавычки, соответствует числу, представляющему код ASCII этого символа. На самом деле такие литералы оцениваются не как char, а как int, поэтому они вполне взаимозаменяемы с другими числовыми литералами.
В вашем выражении '2' взаимозаменяемо с 50, а '0' взаимозаменяемо с 48.
Ответ 5 · рейтинг 2 · Femaref
Посмотрите на таблицу ASCII.
'0' представлен как 0x30, '9' представлен как 0x32.
В C все цифры (от 0 до 9) кодируются в ASCII значениями от 48 до 57 последовательно. Таким образом, '0' на самом деле получает значение 48, а '2' имеет значение 50. Поэтому, когда вы пишете int i = '2' - '0';, вы на самом деле вычитаете 48 из 50 и получаете 2.
Ответ 7 · рейтинг 2 · ouah
'0' до '9' гарантированно являются последовательными значениями в C во всех наборах символов. Это не ограничивается ASCII, а C не ограничивается набором символов ASCII.
Итак, последовательность здесь означает, что значение '2' равно '0' + 2.
Относительно int и char обратите внимание, что значения '0' и '9' относятся к типу int в C, а не к типу char. Символьный литерал имеет тип int.
Ответ 8 · рейтинг 2 · fvu
Оба термина внутренне представлены кодом ASCII числа, и, поскольку числовые цифры имеют последовательные коды ASCII, их вычитание дает вам разницу между двумя числами.
Вы можете проделывать аналогичные трюки и с символами, например, сменить нижний регистр на верхний, вычитая 32 из строчного символа.
'a' - 32 = 'A'
Ответ 9 · рейтинг 2 · Razvan
Это работает только потому, что ASCII присваивает коды символам по порядку, т. е. "2" имеет код символа, который на 2 больше, чем код символа "0".
В другой кодировке это не сработает.
Ответ 10 · рейтинг 2 · devsnd
Когда вы приводите char к int, он фактически сопоставляет каждый символ с соответствующим числом в таблице ascii.
Это означает, что '2' - '0' преобразуется в 50 - 48. Таким образом, вы также можете узнать числовое расстояние между двумя буквами таким же образом, например. 'z' - 'a' равно 122 - 97 равно 25
На самом деле char - это просто байт без знака: C просто обрабатывает его по-разному для разных операций. Например, printf(97) дает 97 на выходе, но printf((char)97) дает вам 'a' на выходе.