重複の可能性:
未定義の動作とシーケンスポイント
標準で定義されているように、E1 + = E2は、E1が1回だけ評価されることを除いて、E1 = E1+E2とほぼ同じです。したがって、さらに、 "p + =(* p)++ + c"; 未定義の動作を引き起こしますか?
gcc / g ++(4.7 / 4.4)で次のコードを試してください。結果には、bxxxxx(g ++ 4.7)またはaxbxxx(gcc、g ++ 4.4)の2種類があります。コードで(1)を実行しているが、(2)を実行していない場合、axbxxxしか取得できません。
#include <stdio.h>
int main() {
char s[] = "axxxxx";
char *p = s;
printf("s = %s in the beginning.\n"
"p is pointed at the %d-th char.\n", s, p - s);
//p = p + (*p)++ * 3 + 2 - 'a' * 3; // (1)
p += (*p)++ * 3 + 2 - 'a' * 3; // (2)
printf("p is moved ahead by %d steps\n", p - s);
printf("s = %s after the operation.\n", s);
return 0;
}
なぜそれが未定義の振る舞いを引き起こすのか、またそれがgccのバグであると断言することもできません。
axbxxxの結果については、オペランドまたはポスト++が2回評価される理由も理解できません(値を取得して後で保存する)。規格では「1…追加」と書いてありますので、一度だけ評価してください。post ++のオペランドのアドレスが一度だけ評価される場合、割り当てが実行される順序に関係なく、式の効果は同じになります。
===更新===
最初のコメントにリンクされているドキュメントを読んだ後、次のルールが重要になると思います。
「2)さらに、前の値は、保存される値を決定するためにのみアクセスされるものとします。」。
したがって、「p = p +(* p)++ * 3 + c」でのpのアクセスは、*pに格納される値とは関係のない*pの「事前値」の一部と見なされますか。 ?
IMO、このルールに違反していません。