Вопрос об арифметике и конкатенации указателей в C ++ - PullRequest
1 голос
/ 16 августа 2010

Как этот код объединяет данные из строкового буфера?Что делает * 10 ?Я знаю, что вычитая «0», вы вычитаете ASCII, поэтому превращаетесь в целое число.

char *buf; // assume that buf is assigned a value such as 01234567891234567
long key_num = 0;
someFunction(&key_num);
...

void someFunction(long *key_num) {

    for (int i = 0; i < 18; i++)
        *key_num = *key_num * 10 + (buf[i] - '0')
}

(скопировано из моей памяти кода, над которым я работаю недавно)

Ответы [ 3 ]

3 голосов
/ 16 августа 2010

В качестве более короткого примера с числом 1234 это можно представить как:

1000 * 1 + 100 * 2 + 10 * 3 + 4

Или:

10 * (10 * (10 * 1 + 2) + 3) + 4

В первый раз в цикле * key_num будет равно 1. Во второй раз он умножается на 10 и 2 добавляется (т.е. 12), в третий раз умножается на 10 и 3 добавляется (т.е. 123), четвертый раз умножается на 10 и 4 добавлено (то есть 1234).

3 голосов
/ 16 августа 2010

Это в основном функция atoi -типа (или atol -типа) для создания целочисленного значения из строки. Рассмотрим строку "123".

Перед запуском key_num устанавливается на ноль.

  • На первой итерации это умножается на 10, чтобы дать вам 0, затем к нему добавляется значение символа '1' и вычитается '0', эффективно добавляя 1, чтобы получить 1.
  • На второй итерации это умножается на 10, чтобы дать вам 10, затем к нему добавляется значение символа '2' и вычитается '0', эффективно добавляя 2, чтобы получить 12.
  • На третьей итерации это умножается на 10, чтобы дать вам 120, затем к нему добавляется значение символа '3' и вычитается '0', эффективно добавляя 3, чтобы получить 123.

Вуаля! Вот оно, 123.

Если вы измените код так:

#include <iostream>

char buf[] = "012345678901234567";
void someFunction(long long *key_num) {
    std::cout << *key_num << std::endl;
    for (int i = 0; i < 18; i++) {
        *key_num = *key_num * 10 + (buf[i] - '0');
        std::cout << *key_num << std::endl;
    }
}

int main (void) {
    long long x = 0;
    someFunction (&x);
    return 0;
}

тогда вы должны увидеть это в действии (мне пришлось изменить ваше значение с 17-символьного массива, который вы указали в комментарии, на 18-символьный , иначе вы ' у меня возникли некоторые проблемы, когда вы пытались использовать персонажа за пределами; мне также пришлось сменить его на long long, потому что мои длинные не были достаточно большими):

0
0
1
12
123
1234
12345
123456
1234567
12345678
123456789
1234567890
12345678901
123456789012
1234567890123
12345678901234
123456789012345
1234567890123456
12345678901234567
1 голос
/ 16 августа 2010

Он просто умножает текущее длинное значение (*key_num) на 10, добавляет цифровое значение и затем снова сохраняет результат.

РЕДАКТИРОВАТЬ: Это ничего не сдвигает. Это просто математика. Вы можете представить это как смещение десятичных цифр, но это внутренне двоичный код.

key_num = 0 (0) 
key_num = key_num * 10 + ('0' - '0') (0)
key_num = key_num * 10 + ('1' - '0') (1)
key_num = key_num * 10 + ('2' - '0') (12)
...