C / C ++ Постинкремент более чем на один - PullRequest
4 голосов
/ 19 марта 2011

Я читаю байты из буфера.Но иногда я читаю слово или больше.

// assume buffer is of type unsigned char *
read_ptr(buffer+(position++))

Это хорошо, но как я могу увеличить позицию на 2 или 4?Я никак не могу заставить оператор += постинкрементать, не так ли?

Причина в том, что у меня есть это большое ужасное выражение, которое я хочу оценить, в то же время увеличивая переменную позиции.

Я думаю, что придумал собственное решение.Я уверен, что это работает.Все будут ненавидеть это, так как это не очень читаемый код.

read_ptr(buffer+(position+=4)-4)

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

ЗАКЛЮЧЕНИЕ:

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

Ответы [ 7 ]

3 голосов
/ 19 марта 2011

Хотя я бы не рекомендовал это решение, но если вы не хотите изменять эту строку в своем коде:

read_ptr(buffer+(position++));

И вы все еще хотите постинкремент position на 2, а затем определить position как Index position(2);, где тип Index определен здесь, а также показано использование:

struct Index
{
    int step;
    int value;
    Index(int s=1, int v=0): step(s), value(v) {}
    Index operator++(int) 
    { 
       Index prev(step, value); 
       value += step; 
       return prev;
    }
    operator int() { return value; }
};

int main() {
        char arr[] = "1234567890" ;

        cout <<"Increment by 2" <<endl;
        Index i2(2); //increment by 2
        cout << *(arr + (i2++)) << endl;
        cout << *(arr + (i2++)) << endl;
        cout << *(arr + (i2++)) << endl;
        cout << *(arr + (i2++)) << endl;

        cout <<"Increment by 3" <<endl;        
        Index i3(3); //increment by 3
        cout << *(arr + (i3++)) << endl;
        cout << *(arr + (i3++)) << endl;
        cout << *(arr + (i3++)) << endl;
        cout << *(arr + (i3++)) << endl;
        return 0;
}

Выход:

Increment by 2
1
3
5
7
Increment by 3
1
4
7
0

Рабочий пример: http://ideone.com/CFgal

Примечание: Я бы все равно не предложил это решение в реальном проекте. Это больше похоже на головоломку: D

3 голосов
/ 19 марта 2011

Вы не;Вы разбиваете его на более чем одну строку.Здесь нет причин складывать все в одну строчку.

read_ptr( buffer + position );
position += n;
3 голосов
/ 19 марта 2011

Оператор + = будет отдельным оператором (не после или перед приращением).Вы можете использовать следующую строку:

func(buffer + position); position += 2;
3 голосов
/ 19 марта 2011

как я могу после увеличения position на 2 или 4?

Вы не можете увеличивать переменную на 2 или 4, но вы можете использовать следующее (в вашем случае)

read_ptr(buffer+position); position += 2;

1 голос
/ 19 марта 2011

В C ++ вы можете легко написать функцию для выполнения постинкрементного двойного приращения:

template <typename T>
T inc2(T &t) {
    T r(t);
    ++t; // or t++ if you want to respect inconsistently-overloaded operators,
    ++t; // but I wouldn't bother.
    return r;
}

read_ptr(buffer+inc2(position))

В C это немного более неловко:

size_t inc2(size_t *s) { // or whatever type you're using
    size_t r = *s;
    (*s) += 2;
    return r;
}

read_ptr(buffer+inc2(&position))

Вы можете охватитьв случае с 4, сделав его дополнительным параметром функции или, возможно, дополнительным параметром шаблона в случае C ++.

Второй вопрос: стоит ли придерживаться этого стиля программирования на C ++ или C, гдеВы делаете так много в одном утверждении.Избежание побочных эффектов может облегчить понимание кода, даже если он выходит дольше.

1 голос
/ 19 марта 2011

Если бы position было указателем на int16 или int32, при увеличении его значения добавилось бы соответственно 2 или 4.

0 голосов
/ 22 марта 2011

Ну, я ответил на мой вопрос в редактировании ... По сути, мне нужно было одно выражение, которое оценивает исходное значение, но имеет побочный эффект увеличения на произвольную величину.Вот несколько макросов.

#define INC(x,inc) (((x)+=(inc))-(inc))
#define INC2(x) INC(x,2)
#define INC4(x) INC(x,4)
#define INC8(x) INC(x,8)
...