編集:これは正しくありませんが、コメントに続く議論がやや明るいので、ここに残しておきます。貴重なものになることを願っています。
これは、C(またはC ++)の演算子の評価順序に基づいて明確に定義されています。
割り当ては、最初に式の右側の評価を強制します。関数適用は最初に引数の評価を強制するので、効果はかなり明確に見えます(私はそれを実行しようとしたことがないので、遠慮なく修正してください!)。一時変数(私はそれらをt0とt1と呼びます)を使用してこれを書き直すことができます、そしてこれはもう少し明確かもしれないと思います:
t0 = y++;
t1 = f(t0);
*y = t1;
「シーケンスポイント」という用語は、少し赤いニシンです。シーケンスポイントは実際には作成されません。むしろ、言語に対して厳密な評価順序が定義されている結果です。
編集:この回答は知的に満足のいくように見えますが、James McNellisの回答は、割り当ての評価順序が明確に定義されていないことを示すC99仕様の関連部分を引用しています。彼の事実を実際にチェックしたことに対する彼の完全な功績。ほとんどのコンパイラがそのようなコードを発行する順序を定期的に変更する可能性は低いと思うので、答えを「明確に定義されている」から「特定のコンパイラに関しておそらく明確に定義されている」に修正します(非常に積極的な最適化を説明するために、「おそらく」と言います)。