2つの表現に違いはありますか?
(*x)++
と
++(*x)
これらのステートメントの両方が*xの(* x + 1)の内容を置き換えていることがわかります。しかし、それらの間に違いはありますか?
2つの表現に違いはありますか?
(*x)++
と
++(*x)
これらのステートメントの両方が*xの(* x + 1)の内容を置き換えていることがわかります。しかし、それらの間に違いはありますか?
(*x)++
*x
;の値に評価されます。副作用として、の値は*x
1ずつ増加します。
++(*x)
*x
+1の値に評価されます。副作用として、の値は*x
1ずつ増加します。
コードを想定すると:
int a = 5;
int *x = &a;
(*x)++
に評価され5
、++(*x)
6に評価されます。
式が評価された直後に副作用を適用する必要はないことに注意してください。次のシーケンスポイントの前にのみ適用する必要があります。
また、括弧は;にとって重要であることに注意してください。(*x)++
postfix++
は単項よりも優先順位が高い*
ため、 ;*x++
として解析されます。*(x++)
それでも、の値に評価されますが*x
、副作用として、ポイントされているものをインクリメントするのではなく、ポインタを進めます。接頭辞と単項は同じ優先順位を持っているため、左から右に適用されます。したがって、同じ結果になります(ではなく、インクリメントされます)。 ++
*
++(*x)
++*x
*x
x
xが指す値が10i:e(* xは10)であるとしましょう
y = (*x)++;
上記のステートメントは1として実行され
ます。y=*x
2. * x = * x + 1
なので、y = 10&*xは11です 。
y = ++(*x);
上記のステートメントは1として実行され
ます。*x= * x + 1
2. y = * x
したがって、y = 11&*xは11です 。
x
1つは、使用前(pre)に格納された値をインクリメントし、もう1つは使用後(post)にインクリメントします。
また、それはと同じで++(*x)
はないことに注意してください(*x + 1)
。1つ目は値をインクリメントして元に戻し、もう1つは値をインクリメントするだけです。
1つは「前」で、もう1つは「後」です。それが違いです。1つは増分の前に評価され(最初のオプション)、もう1つは増分の後に評価されます(2番目のオプション)。