こんにちは、私は 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 = 4b=--ab = 4 and a = 4--aa--
割り当て可能な適切な変数が見つからない場合に表示される L value required エラー。
C の操作順序は、後置演算子が前置演算子よりも優先されることを指定します。後--置演算子は、オペランドの現在の値 (右辺値) を返し、オペランドをデクリメントします。次に、接頭辞のデクリメント演算子が適用されます...ただし、デクリメント/インクリメント演算子は、定義によりオペランドを変更するため、左辺値オペランドが必要です。したがって、コンパイラが言うように、左辺値が必要です。