Выражение ch - '0'
работает, потому что в C "значение каждого символа после 0 ... должно быть на единицу больше, чем значение предыдущего" ( C99 раздел 5.2.1).
Так, например, значение символа '3'
на 3 больше значения '0'
, поэтому при вычитании этих двух значений вы получите целое число 3.
Выражениеtolower(ch) - 'a' + 10
работает по счастливой случайности, потому что, за исключением вышеуказанного ограничения для цифр, все значения символов определяются реализацией.
Таким образом, когда вы вычитаете 'c' - 'a'
, вы получаете 2 (и, добавляя 10, вы получаете12 - правильное значение этой цифры), потому что большинство компьютеров работают в ASCII или EBCDIC.Но когда вы запускаете эту программу на DS9K, вы можете получить −42.
Чтобы быть действительно переносимым, вам нужно сравнить ch
с каждой из шести букв по очереди.Вот почему некоторые системы предоставляют функцию digittoint()
.