以下のコードでは:
main()
{
int i = 5;
printf("%d", ++i++);
}
このプログラムはエラーを出しています"L-Value required"
。
誰かが教えてくれますか:なぜコンパイルエラーなのですか?
以下のコードでは:
main()
{
int i = 5;
printf("%d", ++i++);
}
このプログラムはエラーを出しています"L-Value required"
。
誰かが教えてくれますか:なぜコンパイルエラーなのですか?
後置演算子は前置演算子よりも優先順位が高いため、式++i++
は と同等で ++(i++)
あり、それは と同等 ++( i + 1)
です。コンパイラは、変更可能な左辺値ではない++
式に適用しているため、左辺値エラーを返します。したがって、インクリメント演算子の定義によると、 cでは有効な式ではありません。(i++)
Dennis M. Ritchie の著書"The C Programming Language"によると:
2.8 インクリメントおよびデクリメント演算子
(44ページ)
インクリメントおよびデクリメント演算子は、変数にのみ適用できます。のような表現
(i + j)++
は違法です。オペランドはmodifiable lvalue
、算術型またはポインター型でなければなりません。
関連: gcc 4.4.5 で知りたいと思われる興味深いバグは、左辺j = ++(i | i);
値エラーを生成する式のコンパイルです。読んでください:j = ++(i | i);
そしてj = ++(i & i);
エラーが必要です:左辺値?
さらに、シーケンス ポイントを介在させずに式で同じ変数を複数回変更すると、cおよびc++で未定義の動作が発生します。これらの未定義の動作を で説明してください。i = i++ + ++i;
通常、これを行うとコードがわかりにくくなるため、これを行うべきではありません。
エラーが発生する理由は、ポストインクリメントに優先順位があり、したがって r 値を返すためです。つまり、++i++ == ++(i++)
インクリメントできません。
ただし、事前インクリメント (明らかに、VS2010 では) はそれ自体を返すため、ポストインクリメントできる左辺値を使用できます。(++i)++
i
この行:
printf("%d",++i++)
==>
printf("%d",(++i)++)
と
==>
printf("%d",(++i)); &(++i)++ ==> (++i) = (++i) +1;
(++i) を左の値として使用してください。
これは、定数へのインクリメントを行っているためです..
あなたの場合
++i => 6
++i++ => 6++ //this is not possible. Gives lvalue error
++i+10 => 6+10 => 16 //this is possible
したがって、++i++ を行うのは良くありません。 ポスト インクリメント/デクリメント、プリ インクリメント/デクリメントは変数でのみ可能です。実行時にステートメントは定数になるため、ここで左辺値エラーが発生します。
++i => 6 => i=6;
i++ => 6 => i=7;
printf("%d",i); //7
後置インクリメントは値を返し、その値でプレフィックスをインクリメントしても意味がないため、この式は C では不正であると評価さ++i++
れます。++(i++)
あなたが持っているもの++(5)
は、左辺値ではないものにプレフィックスインクリメントを適用できるため、明らかに違法です。