次の例を検討してください。
struct {
int num;
} s, *ps;
s.num = 0;
ps = &s;
++ps->num;
printf("%d", s.num); /* Prints 1 */
印刷し1
ます。
したがって、演算子の優先順位によると、->
が よりも高い++
ため、最初に値ps->num
(0) がフェッチされ、次に++
演算子がそれを操作するため、1 にインクリメントされるためだと理解しています。
struct {
int num;
} s, *ps;
s.num = 0;
ps = &s;
ps++->num;
printf("%d", s.num); /* Prints 0 */
この例では0
、理由がわかりません。最初の例の説明は、この例でも同じです。しかし、この式は次のように評価されるようです:最初
に、演算子++
が動作し、 に動作するps
ため、次の にインクリメントしますstruct
。それからのみ動作し、次のフィールドを->
フェッチするだけで何もしないため、何もしません。
しかし、これは演算子の優先順位と矛盾しています。num
struct
->
++
誰かがこの動作を説明できますか?
編集:プレフィックス/演算子の優先順位が よりも低い
ことを示す C++ 優先順位テーブルを参照する 2 つの回答を読んだ後、グーグル検索を行い、このルールが C 自体にも適用されることを示すこのリンクを思いつきました。それは正確に適合し、この動作を完全に説明していますが、このリンクの表は、K&R ANSI C の私自身のコピーの表と矛盾していることを付け加えなければなりません。++
--
->
ありがとう。