Когда я читал какой-то старый код сегодня, я заметил следующую строку assert
:
assert(('0' <= hexChar && hexChar <= '9')
|| ('A' <= hexChar && hexChar <= 'F')
|| ('a' <= hexChar && hexChar <= 'f'));
Цель состоит в том, чтобы утверждать, что hexChar
является шестнадцатеричной цифрой ([0-9A-Fa-f]). Он делает это, полагаясь на ASCII-подобный порядок char
объектов, представляющих 'A'
, 'B'
, ..., 'F'
и 'a'
, 'b'
, ..., 'f'
.
Я начал задаваться вопросом, всегда ли это делает то, что я хотел, учитывая, что набор символов выполнения определяется реализацией.
Стандарт C ++ в Разделе 2.3, Наборы символов, упоминает:
Базовый набор символов и базовый набор широких символов должны содержать все элементы базового набора исходных символов, а также управляющие символы, представляющие предупреждение, возврат и возврат каретки плюс нулевой символ (соответственно нулевой широкий символ ), представление которого имеет все нулевые биты. Для каждого базового набора символов выполнения значения элементов должны быть неотрицательными и отличными друг от друга. В исходных и исполняющих базовых наборах символов значение каждого символа после 0 в приведенном выше списке десятичных цифр должно быть на единицу больше, чем значение предыдущего. Набор символов выполнения и набор широких символов исполнения являются определяемыми реализацией надмножествами базового набора символов выполнения и базового набора широких символов выполнения, соответственно. Значения членов наборов символов выполнения и наборов дополнительных элементов зависят от локали.
Я понимаю, что ('0' <= hexChar && hexChar <= '9')
в порядке, потому что '0'
, '1'
, ..., '9'
- цифры, и каждая из них имеет значение на единицу больше, чем предыдущее. Однако порядок других основных исходных символов по отношению друг к другу все еще определяется реализацией.
Это правильное утверждение? Ничего не зная о компиляторе C ++ (не зная деталей реализации), нужно ли переписать assert
следующим образом?
assert(('0' <= hexChar && hexChar <= '9')
|| ('A' == hexChar || 'B' == hexChar || 'C' == hexChar || 'D' == hexChar || 'E' == hexChar || 'F' == hexChar)
|| ('a' == hexChar || 'b' == hexChar || 'c' == hexChar || 'd' == hexChar || 'e' == hexChar || 'f' == hexChar));