いくつかのコードを書いているときに、設定した値が正しく設定されていないという問題に遭遇しました。私は最終的に原因の行を見つけ、周りをテストしているときに、C ++ 14とC ++ 17では動作が異なることがわかりました。コードは次のとおりです。
#include <stdio.h>
#include <cstdint>
#include <cstring>
int main()
{
uint8_t *p = new uint8_t[3];
memset(p, 0x00, 1);
p++;
memset(p, 0xF0, 1);
p++;
memset(p, 0xFF, 1);
p--;
p--;
// This line in particular
*p++ = *p;
*p++ = 0x0F;
p--;
p--;
printf("Position 0 has value %u\n", *p);
p++;
printf("Position 1 has value %u\n", *p);
p++;
printf("Position 2 has value %u\n", *p);
return 0;
}
C ++ 14では、次のように出力されます。
Position 0 has value 240
Position 1 has value 15
Position 2 has value 255
そしてC ++ 17では次のように表示されます:
Position 0 has value 0
Position 1 has value 15
Position 2 has value 255
C ++のバージョンによって動作が異なる理由を知りたいです。C ++ 14では*p
、割り当ての右側がの後に評価されるように見え++
ます。この変更はありましたか?そして、++
が優先される場合、代入演算子の左側の逆参照の前になぜそれが起こらないのですか?
(ポストインクリメントによる)変数の読み取りと書き込み=
は、シーケンスポイントを導入しなかったため、以前は未定義の動作でした。C ++ 14ではどちらかの動作(または何も起こらない、または爆発)を受け取る可能性があります。
これで、このケースに対して定義された順序付け順序があり、C ++ 17の結果は信頼できます。
まだ悪いですが、記述すべきでない不明確なコードです!
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加