6
int val = 5;

printf("%d",++val++); //gives compilation error : '++' needs l-value

int *p = &val;
printf("%d",++*p++); //no error

誰かがこれらの2つのケースを説明できますか? ありがとう。

4

4 に答える 4

27

++val++と同じ++(val++)です。の結果はval++左辺値ではないため、これは不正です。Stephen Canon が指摘したように、 の結果val++が左辺値である場合++(val++)、s の間にシーケンス ポイントがないため、未定義の動作になります++

++*p++と同じ++(*(p++))です。の結果*(p++) 左辺値であるため、これは正当です。

于 2010-09-07T15:24:45.517 に答える
4

++val++(++val)++(またはおそらく++(val++)、とにかくあまり関連性がありません) と同じです。演算子の結果は++変数ではなく値であり、演算子を値に適用することはできません。

++*p++は と同じ++(*(p++))です。の結果p++は値ですが、の結果は、演算子を適用できる*(p++)メモリ位置です。++

于 2010-09-07T15:27:13.657 に答える
1

また、ポインタのアドレスを次のように変更していることにも注意してください

int k = ++*p++;
于 2010-09-07T15:27:43.070 に答える
0

int j = ++val++; //gives compilation error

を事前にインクリメントできないためですrvalue。は、ポスト インクリメント演算子がプリインクリメント演算子よりも優先順位が高いため++val++と解釈されます。を返し、プリインクリメント演算子はそのオペランドが である必要があります。:)++(val++)val++rvaluelvalue

int k = ++*p++; //no error

++*p++として解釈され++(*(p++))ます。これは完全に有効です。

于 2010-09-07T15:25:20.077 に答える