は
--foo++;
Cの有効なステートメント?(コンパイル/実行されますか)そして、これのための実用的なアプリケーションはありますか?
編集で質問を変更して申し訳ありませんが、私は何かを見つけました。
私のC++コンパイラ(Visual Studio 2010)によると:
--++foo;
は有効なコマンドですが
foo--++;
ではありません。これには何か理由がありますか?
は
--foo++;
Cの有効なステートメント?(コンパイル/実行されますか)そして、これのための実用的なアプリケーションはありますか?
編集で質問を変更して申し訳ありませんが、私は何かを見つけました。
私のC++コンパイラ(Visual Studio 2010)によると:
--++foo;
は有効なコマンドですが
foo--++;
ではありません。これには何か理由がありますか?
いいえ、インクリメント/デクリメント演算子の結果は左辺値ではないため、無効です。
編集: OPはさらに2つの例を追加して彼の質問を編集しました。同じ理由で、ここに行きます:
--++foo;
--foo++;
foo--++;
インクリメント/デクリメント演算子の結果は左辺値ではないため、これらはすべて無効な式ステートメントです。コンパイラーは言語を拡張してこれらの式を受け入れることができますが、厳密に準拠したプログラムにこれらの式を含めることはできません。
これは C 式であるため、いくつかのカスケード評価ステップに従って結果を見つける必要があります。
あなたの表現は
--++foo;
この最初のステップを評価しましょう:-
++フー;
続行するには評価する必要があります
foo が foo+1 になるように、事前にインクリメントする方法があります。
その後、割り当てが発生します
つまり、これは foo=foo+1; と評価されます。
および foo の値は、変数への代入のために返されます (何も存在しない場合は無視されます)。
だから今、私たちの表現は以下のようです
--(++foo); に評価された
--(定数値);// foo+1 の結果
再びステートメントは次のように評価されます
a constant value=constant_value+1;//右部分は問題ありませんが、左部分は変数ではありません
代入演算子の左側は変数ではないため、エラーが発生します。
そのため、有効なオペランドがありません -- /decrement 演算子なので、左辺値が必要なエラーです