Eine fixe Zahl ist nicht besonders portabel. Auf einem anderen Zeichensatz stimmt sowas schnell nicht mehr.
Auf der anderen Seite gehst du aber davon aus, dass die Zeichen 123456789 immer genau in dieser Reihenfolge nach dem Zeichen 0 kommen. Wenn ein Zeichensatz zB 1234567890 drinnen hat (was gar net soo überraschend wäre), funktioniert der Code erst recht nicht.
De facto verwendet seit den 80ern des vorigen Jahrhunderts kein System mehr einen Zeichensatz, der nicht auf ASCII basiert (sogar das LCD vor mir mit HD44870-Controller verwendet ein encoding, das in den ersten 128 Zeichen ASCII entspricht). Im Grunde geht es bei '0' vs. 48 nur darum, was besser lesbar ist. Niemand weiß, was 48 bedeuten soll dort. Wenn man zusätzlich noch 3 abziehen will, kann man ja einfach ('0'-3) schreiben.