int val = 5;
printf("%d",++val++); //gives compilation error : '++' needs l-value
int *p = &val;
printf("%d",++*p++); //no error
誰かがこれらの2つのケースを説明できますか? ありがとう。
int val = 5;
printf("%d",++val++); //gives compilation error : '++' needs l-value
int *p = &val;
printf("%d",++*p++); //no error
誰かがこれらの2つのケースを説明できますか? ありがとう。
++val++
と同じ++(val++)
です。の結果はval++
左辺値ではないため、これは不正です。Stephen Canon が指摘したように、 の結果val++
が左辺値である場合++(val++)
、s の間にシーケンス ポイントがないため、未定義の動作になります++
。
++*p++
と同じ++(*(p++))
です。の結果*(p++)
は左辺値であるため、これは正当です。
式++val++
は(++val)++
(またはおそらく++(val++)
、とにかくあまり関連性がありません) と同じです。演算子の結果は++
変数ではなく値であり、演算子を値に適用することはできません。
式++*p++
は と同じ++(*(p++))
です。の結果p++
は値ですが、の結果は、演算子を適用できる*(p++)
メモリ位置です。++
また、ポインタのアドレスを次のように変更していることにも注意してください
int k = ++*p++;
int j = ++val++; //gives compilation error
を事前にインクリメントできないためですrvalue
。は、ポスト インクリメント演算子がプリインクリメント演算子よりも優先順位が高いため++val++
と解釈されます。を返し、プリインクリメント演算子はそのオペランドが である必要があります。:)++(val++)
val++
rvalue
lvalue
int k = ++*p++; //no error
++*p++
として解釈され++(*(p++))
ます。これは完全に有効です。