7

ポストインクリメント (またはプリインクリメント) は、equal(=) の右側でのみ実行できるという印象を受けました。しかし、以下のコードをコンパイルできます。この特定のコード、特に次の行を理解するのを手伝ってくれませんか。ソース: http://www.ibm.com/developerworks/library/pa-dalign/

*data8++ = -*data8;


void Munge8( void *data, uint32_t size ) {
    uint8_t *data8 = (uint8_t*) data;
    uint8_t *data8End = data8 + size;

    while( data8 != data8End ) {
        *data8++ = -*data8;
    }
}
4

5 に答える 5

4

あなたの印象は間違っていると思います。あなたは間違いなく次のようなことができます:

*a++ = *b++;

実際、多くの場合、そのようstrcpyに実装されています。ポストインクリメントまたはプリインクリメントを=まったく使用せずに使用することもできます。

a++;
于 2012-06-18T18:26:20.923 に答える
1

代入演算子の左側で事後インクリメントを実行できない理由はありません。ポストインクリメント演算子は、オブジェクトの一時コピーを以前の状態で返すだけであり、その一時オブジェクト (この場合はポインター) に対して操作を実行できます。

さて、次の場合:

*data8++ = -*data8;

演算子の順序付けにより、data8ポインターは最初にポストインクリメントされ、前のポインター値のコピーが返されます。その前のポインター値は逆参照され、代入演算子の右側の式の結果が代入されます。

編集:他の人が指摘したようにdata8、シーケンス ポイントなしでそのメモリ位置に書き込んでいるときに複数回読み取ることによって内容を変更しているため、これは未定義の動作です。

于 2012-06-18T18:26:26.500 に答える
0

と思います

*data8++ = -*data8;

と同等です

*data8 = - *(data8 + 1);

データ8 = データ8 +1

于 2015-08-14T09:21:55.413 に答える