9

バッファからバイトを読み取っています。しかし、時々私が読んでいるのは単語またはそれ以上です。

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

それは問題ありませんが、位置を 2 または 4 ずつポストインクリメントするにはどうすればよいですか? +=オペレーターにポストインクリメントをさせる方法はありませんよね?

理由は、評価したいこの大きなひどい式があり、同時に位置変数をインクリメントしているためです。

独自の解決策を思いついたと思います。私はそれがうまくいくと確信しています。ただし、これはあまり読みやすいコードではないため、誰もがそれを嫌うでしょう。

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

次に、これを少しテストして正しいことを確認した後、これをマクロにします。

結論は:

これをしないでください。これは保守不可能なコードを生成するようなものであるため、これは悪い考えです。しかし...前インクリメント演算子を後インクリメント演算子に変換するのは非常に簡単です。

4

7 に答える 7

4

ただし、このソリューションはお勧めしませんが、コード内のこの行を変更したくない場合:

read_ptr(buffer+(position++));

そして、あなたはまだposition2でポストインクリメントしたいし、ここで型が定義されている場所として位置を定義し、使用法も示しています: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

于 2011-03-19T07:09:01.640 に答える
4

positionポストインクリメントを 2 または 4にするにはどうすればよいですか?

変数を2または4でポストインクリメントすることはできませんが、次を使用できます(あなたの場合)

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

于 2011-03-19T06:49:34.133 に答える
3

+= 演算子は別個のステートメントになります (ポスト インクリメントまたはプレ インクリメントではありません)。次の行を使用できます。

func(buffer + position); position += 2;
于 2011-03-19T06:50:02.387 に答える
3

あなたはそうしない; 複数の行に分割します。ここですべてを 1 行に詰め込む理由はありません。

read_ptr( buffer + position );
position += n;
于 2011-03-19T06:50:46.100 に答える
2

まあ、私は編集で私の質問に答えました...基本的に私が欲しかったのは、元の値に評価されるが、任意の量だけインクリメントする副作用がある単一の式でした。ここにいくつかのマクロがあります。

#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)
于 2011-03-22T04:30:34.937 に答える
1

またはpositionへのポインターである場合、それをインクリメントすると、それぞれ 2 または 4 が追加されます。int16int32

于 2011-03-19T06:50:36.460 に答える
1

C++ では、post-style double-increment を実行する関数を簡単に作成できます。

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))

追加の関数パラメーターにするか、C++ の場合は追加のテンプレート パラメーターにすることで、4 のケースもカバーできます。

2 番目の質問があります。このスタイルのプログラミングを C++ で追求する価値があるのか​​、それとも 1 つのステートメントで多くのことを行う C で追求する価値があるのか​​ということです。副作用を回避することで、コードが長くなっても理解しやすくなります。

于 2011-03-19T11:53:01.123 に答える