Страницы

Поиск по вопросам

среда, 29 января 2020 г.

Преобразование char -> int цифры и буквы

#cpp #c #стандарт #language_lawyer


Довольно часто в коде можно увидеть строки типа 

char cdigit = '8';
int idigit = cdigit - '0';


Реже, но также встречается

char letter = 'd';
int letter_number = letter - 'a';


Открываем Страуструпа "Язык прогрммирования С++" специальное издание, "Бином-Пресс",
2008. Цитата (стр 110):


  Небезопасно считать, ... что символы алфавита непрерывны (в стандарте EBCDIC между
i и j имеется разрыв)


У Кернигана и Ритчи вышеприведенный код (по крайней мере по цифрам) встречается регулярно.

Собственно вопрос по цифрам: обязательно ли корректен код idigit = cdigit - '0'?
    


Ответы

Ответ 1



В стандарте C++ §2.3/4 гласит: In both the source and execution basic character sets, the value of each character after 0 in the above list of decimal digits shall be one greater than the value of the previous. то есть В обоих наборе символов исходного текста и времени выполнения, значение каждого символа после 0 в приведённом выше списку десятичных цифр должно быть на единицу больше предыдущего. (перевод мой). Приведённый в §2.3/1 набор цифр таков: 0 1 2 3 4 5 6 7 8 9 Это гарантирует последовательность значений кодов цифр.

Ответ 2



Нашел всё-таки такую фразу в сишном Стандарте (C99): In both the source and execution basic character sets, the value of each character after0in the above list of decimal digits shall be one greater than the value of the previous.

Комментариев нет:

Отправить комментарий