В соответствии со стандартом:
Значения членов набора символов выполнения определены как реализация.
(ISO/IEC 9899: 1999 5.2.1/1)
Далее в стандарте:
... значение каждого символа после
0
в приведенном выше списке десятичных цифр должно быть больше, чем значение предыдущего.
(ISO/IEC 9899: 1999 5.2.1/3)
Похоже, что стандарт требует, чтобы набор символов выполнения включал 26 прописных и 26 строчных букв латинского алфавита, но я не вижу необходимости в том, чтобы эти символы были упорядочены каким-либо образом. Я вижу только порядок для десятичных цифр.
Это, по-видимому, означает, что, строго говоря, нет гарантии, что 'a' < 'b'
. Теперь буквы алфавита упорядочены в каждом из ASCII, UTF-8 и EBCDIC. Но для ASCII и UTF-8 имеем 'A' < 'a'
, а для EBCDIC - 'A' < 'a'
.
Хорошо бы иметь функцию в ctype.h
, которая сравнивает буквенные символы переносимо. Коротко это или что-то подобное, мне кажется, что нужно искать в локали, чтобы найти значение CODESET
и действовать соответственно, но это не кажется простым.
Моя кишка говорит мне, что это почти никогда не проблема; для большинства случаев алфавитные символы могут обрабатываться путем преобразования в нижний регистр, поскольку для наиболее часто используемых наборов символов буквы находятся в порядке.
Вопрос: учитывая два символа
char c1;
char c2;
существует простой, переносимый способ определить, предшествует ли c1
c2
в алфавитном порядке? Или мы предполагаем, что строчные и прописные символы всегда встречаются последовательно, даже если это не гарантируется стандартом?
Чтобы прояснить любую путаницу, меня действительно интересуют 52 буквы латинского алфавита, которые гарантированы стандартом в наборе символов исполнения. Я понимаю, что другие наборы букв важны, но кажется, что мы даже не можем знать о упорядочении этого небольшого подмножества букв.
Изменить
Я думаю, что мне нужно уточнить немного больше. Проблема, как я вижу, заключается в том, что мы обычно думаем о 26 строчных буквах латинского алфавита, которые заказываются. Я хотел бы иметь возможность утверждать, что "a" предшествует "b", и мы имеем удобный способ выразить это в коде как 'a' < 'b'
, когда мы даем интегральные значения "a" и "b". Но стандарт не дает никаких заверений в том, что приведенный выше код будет оцениваться как ожидалось. Почему нет? Стандарт действительно гарантирует это поведение для цифр 0-9, и это кажется разумным. Если я хочу определить, предшествует ли одна буква char другой, скажем, для сортировки, и если я хочу, чтобы этот код был действительно портативным, кажется, что стандарт не предлагает никакой помощи. Теперь я должен полагаться на соглашение о том, что ASCII, UTF-8, EBCDIC и т.д. Приняли, что 'a' < 'b'
должно быть правдой. Но это не очень переносимо, если только используемые наборы символов не полагаются на это соглашение; это может быть правдой.
Этот вопрос возник для меня в другом вопросе: Проверьте, есть ли письмо до или после другого письма в C. Здесь несколько человек предложили вам определить порядок двух букв, хранящихся в char
, используя неравенства. Но один комментатор отметил, что это поведение не гарантируется стандартом.