Почему функция 'lower' имеет тип int в качестве типа возвращаемого значения и типа ввода? - PullRequest
0 голосов
/ 23 октября 2018
int main(void)
{
    char s[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    int i;

    i = 0;
    while (s[i] != '\0') {
        printf("%c -> %c\n", s[i], lower(s[i]));
        i++;
    }

    return 0;
}

int lower(int c)
{
    return (c >= 'A' && c<= 'Z') ? c + 'a' - 'A' : c;
}

Это программа для преобразования всех алфавитов в нижний регистр.Поэтому в решении они использовали более низкую функцию, но я не знаю, почему они использовали int в качестве возвращаемого типа.

Ответы [ 2 ]

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

Скорее всего, это попытка имитировать функцию tolower, которая использует int.

Подобный вопрос о tolower, использующий int, здесь. Почему putchar, toupper, tolower и т. Д. Принимают вместо целого числа int?

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

Почему функция 'lower' имеет тип int в качестве типа возврата и типа ввода?

  1. Код полностью int математический.Даже если бы подпись была char c, код имел бы результат int из-за обычных целочисленных повышений.

    int lower(int c) {
      return (c >= 'A' && c<= 'Z') ? c + 'a' - 'A' : c;
    }
    
  2. Для отображения обычно 257 различных значений, таких как tolower()int lower(char c) { и c < 0 это может работать не так, как tolower().

  3. int обычно близко к целочисленному размеру собственного процессора, а код обычно самый быстрый и быстрый с int против char.Это исторически сложившийся выбор и компромисс.Включение исходного C не создало прототип сигнатуры функции, и все аргументы int и sub- int были переведены в int.

7.4 Обработка символов

Заголовок <ctype.h> объявляет несколько функций, полезных для классификации и сопоставления символов.Во всех случаях аргументом является int, значение которого должно быть представлено как unsigned char или равным значению макроса EOF.Если аргумент имеет любое другое значение, поведение не определено.C11dr §7.4 1

Эти is...() и to...() функции работают в unsigned char rangeEOF), а не char.

Устойчивый код позволит избежатьотрицательный char при вызове tolower() или tolower() -подобных функций.

// printf("%c -> %c\n", s[i], lower(s[i]));
printf("%c -> %c\n", s[i], lower((unsigned char) s[i]));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...