Кто определяет порядок символов - PullRequest
9 голосов
/ 26 июля 2010

У меня есть запрос на основе приведенной ниже программы -

char ch;
ch = 'z';
while(ch >= 'a')
{
    printf("char is  %c and the value is %d\n", ch, ch);
    ch = ch-1;
}

Почему печать всей строчной буквы не гарантируется в вышеуказанной программе. Если C не дает много гарантий относительно порядка символов во внутренней форме, то кто на самом деле это делает и как?

Ответы [ 6 ]

17 голосов
/ 26 июля 2010

Разработчик компилятора выбирает базовый набор символов. Единственное, что должен сказать стандарт, это то, что должно быть доступно определенное минимальное количество символов и что числовые символы являются смежными.

Обязательные символы для среды выполнения C99: от A до Z, a до z, 0 до 9 (которые должны быть вместе и по порядку), любые из !"#%&'()*+,-./:;<=>?[\]^_{|}~ , пробел, горизонтальная табуляция, вертикальная табуляция, подача формы, оповещение, возврат, возврат каретки и новая строка. Это остается неизменным в текущем проекте C1x, следующей итерации этого стандарта.

Все остальное зависит от реализации.

Например, код вроде:

int isUpperAlpha(char c) {
    return (c >= 'A') && (c <= 'Z');
}

сломается на мэйнфрейме, который использует EBCDIC, разделяя символы верхнего регистра на две области.

Действительно переносимый код примет это во внимание. Весь другой код должен документировать его зависимости.

Более переносимая реализация вашего примера будет выглядеть примерно так:

static char chrs[] = "zyxwvutsrqponmlkjihgfedcba";
char *pCh = chrs;
while (*pCh != 0) {
    printf ("char is %c and the value is %d\n", *pCh, *pCh);
    pCh++;
}

Если вы хотите портативное решение real , вам, вероятно, следует использовать islower(), поскольку код, который проверяет только латинские символы, не будет переносимым (например) на греческий язык, использующий Unicode для своего основного набора символов .

4 голосов
/ 26 июля 2010

Почему печать всего набора строчные буквы не гарантируются в вышеуказанная программа.

Поскольку можно использовать C с кодировкой символов EBCDIC , в которой буквы не являются последовательными.

1 голос
/ 26 июля 2010

В наши дни люди, называющие ваш код непереносимым, занимаются бесполезной педантичностью.Поддержка кодировок, несовместимых с ASCII, остается только в стандарте C из-за устаревших мэйнфреймов EBCDIC, которые отказываются умирать.Вы никогда не встретите ASCII-несовместимую кодировку символов на любом современном компьютере, ни сейчас, ни в будущем.Дайте ему несколько десятилетий, и вы никогда не столкнетесь ни с чем, кроме UTF-8.

Чтобы ответить на ваш вопрос о , кто решит кодировку символов: хотя это номинально в представлении вашей реализации(компилятор C, библиотека и ОС), в конечном итоге это было решено Интернетом, как существующей практикой, так и стандартами IETF.Предположительно современные системы предназначены для взаимодействия и взаимодействия друг с другом, и было бы огромной головной болью для преобразования каждого заголовка протокола, файла html, источника javascript, имени пользователя и т. Д. Назад и вперед между ASCII-совместимыми кодировками и EBCDIC или некоторыми другимидругой локальный беспорядок.

В последнее время стало ясно, что универсальное кодирование не только для машинного текста, но и для текста на естественном языке также крайне желательно.(Обмен текстами на естественном языке не так фундаментален, как машинный текст, но все же очень распространен и важен.) Unicode предоставил набор символов, и, как единственная ASCII-совместимая кодировка Unicode, UTF-8 является в значительной степени преемником ASCII, посколькууниверсальная кодировка символов.

1 голос
/ 26 июля 2010

Это определяется тем, какой набор символов выполнения.

В большинстве случаев в настоящее время это набор символов ASCII, но C не требует использования определенного набора символов.

Обратите внимание, что есть некоторые гарантии относительно порядка символов в наборе символов выполнения. Например, каждая цифра от 0 до 9 гарантированно будет иметь значение на единицу больше, чем значение предыдущей цифры.

1 голос
/ 26 июля 2010

Очевидно, определяется реализацией C, которую вы используете, но с большей вероятностью для вас это определяется Американским стандартным кодом для обмена информацией ( ASCII ).

0 голосов
/ 23 октября 2017

Я отвечаю вам слишком поздно, но помимо того, что уже было сказано, я хочу добавить немного.

На 5-й фазе перевода (часть препроцессора) каждый элемент исходного набора символов преобразуется в соответствующий символ набора символов выполнения. Цитата ISO 9899, 5.1.1.2p5

  1. Каждый элемент исходного набора символов и escape-последовательность в символьных константах и строковые литералы преобразуются в соответствующий член символа выполнения задавать; если соответствующего члена нет, он преобразуется в определяемый реализацией член, отличный от нулевого (широкого) символа. 7)

Нет необходимости, чтобы исходный набор символов совпадал с набором символов выполнения; как говорят другие, если набор символов выполнения равен EBCDIC мэйнфрейма IBM , логика не такая, как в случае набора символов ASCII.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...