C ++ 14とC ++ 17の違い: `* p ++ = * p`

ApplePearPerson:

いくつかのコードを書いているときに、設定した値が正しく設定されていないという問題に遭遇しました。私は最終的に原因の行を見つけ、周りをテストしているときに、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、割り当ての右側がの後に評価されるように見え++ます。この変更はありましたか?そして、++が優先される場合、代入演算子の左側の逆参照の前になぜそれが起こらないのですか?

Orbitでの軽量レース:

(ポストインクリメントによる)変数の読み取りと書き込み=は、シーケンスポイントを導入しなかったため、以前は未定義の動作でした。C ++ 14ではどちらかの動作(または何も起こらない、または爆発)を受け取る可能性があります。

これで、このケースに対して定義された順序付け順序があり、C ++ 17の結果は信頼できます。

まだ悪いですが、記述すべきでない不明確なコードです!

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

* p ++と* p ++ = * qの違い

分類Dev

式* p ++と++ * pの動作の違い

分類Dev

sizeof(* p)とsizeof(p)の違いは?

分類Dev

正規表現の<p>(。+?)<\ / p>と(?<= <p>)(。+?)(?= <\ / p>)の違いは何ですか

分類Dev

C ++ 11のP99_FOR

分類Dev

GdipBitmapConvertFormatのC#p / invoke

分類Dev

「for(; * p; ++ p)* p = tolower(* p);」Cで動作しますか?

分類Dev

gdbのxとpの違いは?

分類Dev

summary()とglance()のp値の違いは?

分類Dev

Javaの(p!= q)と!(p == q)の違いは何ですか

分類Dev

HTMLの<P>と<p>の違いは何ですか?

分類Dev

pとプットの違い

分類Dev

MSWordマクロ^ pと^ 13の違い

分類Dev

c ++ 14 std :: Experimental :: filesystem :: v1とc ++ 17 std :: filesystemの違いは?

分類Dev

Cではint * p =&i;を宣言するのは間違っていますか?

分類Dev

P2PクライアントとP2Pデバイスの違いを理解する

分類Dev

C配列でのp [-2]の出力

分類Dev

C配列でのp [-2]の出力

分類Dev

C ++ 17でauto * p {nullptr}が機能しないのにconst auto&p {nullptr}が機能するのはなぜですか?

分類Dev

c3p0.idle_test_periodの使用。

分類Dev

p#q#c#のR正規表現

分類Dev

「auto ch = unsigned char {'p'}」がC ++ 17でコンパイルされないのはなぜですか?

分類Dev

Rustの「p:& 'a i32」と「p:&' statici32」の寿命の違いは?

分類Dev

forループJavascriptで使用する場合のp ++と++ pの違い

分類Dev

BittorrentとNapster / LimewireのようなP2Pサービスの違い

分類Dev

C#P2P:ピアのデータとコメントが設定されていません

分類Dev

C ++ 14とC ++ 17のデフォルトのコンストラクター呼び出しの違い

分類Dev

セレクターdiv + p(プラス)とdiv〜p(チルダ)の違い

分類Dev

p :: first-letterとp :: first-letterの違いは何ですか?

Related 関連記事

  1. 1

    * p ++と* p ++ = * qの違い

  2. 2

    式* p ++と++ * pの動作の違い

  3. 3

    sizeof(* p)とsizeof(p)の違いは?

  4. 4

    正規表現の<p>(。+?)<\ / p>と(?<= <p>)(。+?)(?= <\ / p>)の違いは何ですか

  5. 5

    C ++ 11のP99_FOR

  6. 6

    GdipBitmapConvertFormatのC#p / invoke

  7. 7

    「for(; * p; ++ p)* p = tolower(* p);」Cで動作しますか?

  8. 8

    gdbのxとpの違いは?

  9. 9

    summary()とglance()のp値の違いは?

  10. 10

    Javaの(p!= q)と!(p == q)の違いは何ですか

  11. 11

    HTMLの<P>と<p>の違いは何ですか?

  12. 12

    pとプットの違い

  13. 13

    MSWordマクロ^ pと^ 13の違い

  14. 14

    c ++ 14 std :: Experimental :: filesystem :: v1とc ++ 17 std :: filesystemの違いは?

  15. 15

    Cではint * p =&i;を宣言するのは間違っていますか?

  16. 16

    P2PクライアントとP2Pデバイスの違いを理解する

  17. 17

    C配列でのp [-2]の出力

  18. 18

    C配列でのp [-2]の出力

  19. 19

    C ++ 17でauto * p {nullptr}が機能しないのにconst auto&p {nullptr}が機能するのはなぜですか?

  20. 20

    c3p0.idle_test_periodの使用。

  21. 21

    p#q#c#のR正規表現

  22. 22

    「auto ch = unsigned char {'p'}」がC ++ 17でコンパイルされないのはなぜですか?

  23. 23

    Rustの「p:& 'a i32」と「p:&' statici32」の寿命の違いは?

  24. 24

    forループJavascriptで使用する場合のp ++と++ pの違い

  25. 25

    BittorrentとNapster / LimewireのようなP2Pサービスの違い

  26. 26

    C#P2P:ピアのデータとコメントが設定されていません

  27. 27

    C ++ 14とC ++ 17のデフォルトのコンストラクター呼び出しの違い

  28. 28

    セレクターdiv + p(プラス)とdiv〜p(チルダ)の違い

  29. 29

    p :: first-letterとp :: first-letterの違いは何ですか?

ホットタグ

アーカイブ