こんにちは、私は C プログラミング言語の基礎を学んでいます。最近、post および pre のインクリメント/デクリメント演算子、およびlvalue と rvalueについて学びました。次のプログラムは、 lvalue requiredというエラーを示しています。誰でも理由を説明できますか?
int main(){
int x = 8, y;
y = --x--;
printf("y=%d",y);
return 0;
}
説明してください、なぜそうなのですか?
では、 で何が起こっているか見てみましょう--x--
。最初に、post-decrement が実行されます: --(x--)
.
(x--) = 7
. その後、この操作の結果が元の構造に配置されます:
--7
- 意味がありません - したがって、lvalue required
エラーが発生します
このステートメント y = --x--;
は、 でのコンパイル時に次のエラーを返しますC
。lvalue required
. これは、post decrement operator -- がrvalue
変数 x の操作後に を返すためです。そのため、デクリメント前の演算子を実行する左辺値はありません-その後。
しかし、これはC
とC++
が異なる点の 1 つです。次C
のステートメントでも同じエラーが発生しますlvalue required
。
y = (--x)--;
しかしC++
、ステートメントy = (--x)--;
では正常にコンパイルされ、の値y
は7
. C とは異なり、C++ は、lvalue
変数 x に対して pre decrement 演算子を実行した後に を返すためです。
L Value
@Pavelで説明されているように、Lvalueはオブジェクトではなく値になっているため、エラーが発生しています。
--x
意味x = x-1
しますが、あなたの場合、--7
どちらが同等で7 =7-1
あるかは間違いなく有効な式ではありません。
これ以外に、間にシーケンス ポイントがない同じ変数に対して複数の操作を行うと、未定義の動作が発生します。
コンパイラの動作がわからないので、一度に使用しないでください。したがって、コードをガイドして、好きなことを強制的に実行させる必要があります。
今、あなたのポイントに来てください。値を 1 減らしたい場合は、a--
またはを使用できます--a
。彼らも同じことをします。a = 5 を使用するb=a--
と、値がすぐに割り当てられ、ステートメントが完了した後に値が割り当てられます。あなたが明確であることを願っています。b = 5 and a = 4
b=--a
b = 4 and a = 4
--a
a--
割り当て可能な適切な変数が見つからない場合に表示される L value required エラー。
C の操作順序は、後置演算子が前置演算子よりも優先されることを指定します。後--
置演算子は、オペランドの現在の値 (右辺値) を返し、オペランドをデクリメントします。次に、接頭辞のデクリメント演算子が適用されます...ただし、デクリメント/インクリメント演算子は、定義によりオペランドを変更するため、左辺値オペランドが必要です。したがって、コンパイラが言うように、左辺値が必要です。