что делает эта функция, которая помогает ей по-разному воспринимать ввод и как выполняются условия для цикла for - PullRequest
0 голосов
/ 15 марта 2019

Что делает эта функция, которая помогает ей по-разному воспринимать ввод и как выполняются условия для цикла for?

void scanint(int &x)
{
  int flag=0;
  register int c = gc();
  if(c == '-') flag=1;
  x = 0;
  for(;(c<48 || c>57);c = gc());//why is this used?
  for(;c>47 && c<58;c = gc()) {x = (x<<1) + (x<<3) + c - 48;}//how  is this executed ?
  if(flag == 1)x=-x;
}

1 Ответ

0 голосов
/ 15 марта 2019

Это не с.

void scanint(int &x) {/* Whatever */}
//               ^^

Определяет функцию, принимающую ссылку на int, и в c нет ссылок, аргументы передаются по значению в функции. Конечно, вы можете использовать указатель на int, но тогда тело функции должно быть соответствующим образом изменено, используя *x вместо вхождений муравья x.

Далее предполагается, что gc() обозначает функцию, аналогичную getchar(), поэтому отправленный код представляет собой очень плохой способ извлечения значения int из stdin:

void scanint(int &x)   // Or 'int *x' in C
{
    int c = gc();      // register was deprecated in C++17

    bool is_negative = (c == '-'); // C has bool from C99 too

    x = 0;             // '*x = 0;' in C. The same applies to the following code

    // Considering only ASCII, ignores non-digit characters
    // E.g. from "  123" it ignores the first two spaces,
    // but, given " -123", it will ignore the sign too. Bad, as I said.
    for( ;
         ( c < '0'  ||  c > '9');  
         c = gc() )
    ;

    // Now computes the actual number using an old trick that should
    // be left to the compiler to be exploited:
    // 10 * x = (2 + 8) * x = 2 * x + 8 * x = x << 1  +  x << 3 (bit shifts)
    for( ;
         '0' <= c  &&  c <= '9';
         c = gc() )
    {
        x = (x << 1) + (x << 3) + c - '0';
    }
    if ( is_negative )
        x = -x;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...