LINUX.ORG.RU

getint из K&R

 


0

1

Не могу понять одну вещь из примера в знаменитом K&R:

int getint(int *pn)
{
    int c, sign;

    while (isspace(c = getch()))   /* skip white space */
            ;

    if (!isdigit(c) && c != EOF && c != '+' && c != '-') {
            ungetch(c);  /* it is not a number */
            return 0;
    }
    sign = (c == '-') ? -1 : 1;
    if (c == '+' || c == '-')
            c = getch();
    for (*pn = 0; isdigit(c); c = getch())
            *pn = 10 * *pn + (c - '0');
    *pn *= sign;
    if (c != EOF)
            ungetch(c);
    return c;
}

Как работает это (c - '0')? Без него функция не правильно работает, но в чем смысл этого вычитания?

★★★★

Посмотри на ASCII-таблицу, посмотри на код символа '0'. Если коротко: ты преобразуешь символ «c» в цифру

XMs ★★★★★
()

Непонятно, зачем анскильные лалки пишут про ASCII, вопрос ведь про язык C.

5.2.1/3

Both the basic source and basic execution character sets shall have the following members:
...
the 10 decimal digits

0 1 2 3 4 5 6 7 8 9
...
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.

utf8nowhere ★★★
()

Не могу понять одну вещь из примера в знаменитом K&R:

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

Так будет понятнее?

int char2int(char ch) {
    return isdigit(ch) ? ch - '0' : -1;
}
...
    - *pn = 10 * *pn + (c - '0');
    + *pn = 10 * *pn + char2int(c);
...

driver
()
Ответ на: комментарий от utf8nowhere

вопрос ведь про язык C.

Вопрос про The C Programming Language, а ты со своей ансипарашей вылез из под шконки.

aedeph_ ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.