13

以下のコードは、C コンパイラでのコンパイルでエラーが発生します

++(-i);
error: lvalue required as increment operand

-i が右辺値を返すことを意味します。

ながらコード

++(+i);

エラーを出さないでください。なんでそうなの?このリンクは、 +i が左辺値にならないことを示しています。

4

2 に答える 2

5

これはコンパイラの不具合です。C 言語では、演算子が適用される前であっても、式のすべての左辺値が右辺値に変換されます。ただし、sizeof&++--および代入の左辺のオペランドは例外です.(6.3.2/2 を参照) 。

言い換えれば、C 言語で+iは、単項+が右辺値を生成すると思われるからではなく、その単項がその機能を実行する機会を得るiに右辺値に変換されるため、右辺値を生成する必要があります。+

たとえば、int i値を保持する変数の場合42、式+iは式と完全に同等+42です。の左辺値性iは失われ、単項のセマンティクスが作用する42 +に変換されます。

言うまでもなく、この場合、unary の結果が+左辺値になる可能性はありません。

于 2012-08-18T20:34:49.000 に答える
0

C99 標準から ( 6.5.3.3 単項算術演算子):

2 単項 + 演算子の結果は、その (プロモートされた) オペランドの値です。オペランドに対して整数昇格が実行され、結果は昇格された型になります。

3 単項 - 演算子の結果は、その (プロモートされた) オペランドの否定です。オペランドに対して整数昇格が実行され、結果は昇格された型になります。

この特定のコンテキストでは、昇格された値を使用するコードはありません+i。したがって、コンパイラはそれが と同等であると想定しi、このため、それを左辺値として扱うと思います。または、単項+をまったく実装していないだけかもしれません。とにかく、それはあなたがすべきことではありません.他のコンパイラは単にそれを禁止します.

-i実際の操作を実行するため、その結果は一時的なものです。したがって、それはもう変数ではないため、インクリメントすることはできません。

そして、標準は6.3.2.1 その他のオペランド / Lvalues、arrays、および function designators でそれを明確にします:

2 sizeof 演算子、単項 & 演算子、++ 演算子、--演算子、または . の左オペランドの場合を除きます。演算子または代入演算子の場合、配列型を持たない左辺値は、指定されたオブジェクトに格納されている値に変換されます (左辺値ではなくなります)。[…]

于 2012-08-18T15:56:18.007 に答える