2

こんにちは、私は C プログラミング言語の基礎を学んでいます。最近、post および pre のインクリメント/デクリメント演算子、およびlvalue と rvalueについて学びました。次のプログラムは、 lvalue requiredというエラーを示しています。誰でも理由を説明できますか?

int main(){
  int x = 8, y;
  y = --x--;
  printf("y=%d",y);
  return 0;
}

説明してください、なぜそうなのですか?

4

5 に答える 5

6

では、 で何が起こっているか見てみましょう--x--。最初に、post-decrement が実行されます: --(x--). (x--) = 7. その後、この操作の結果が元の構造に配置されます: --7- 意味がありません - したがって、lvalue requiredエラーが発生します

于 2013-07-03T05:16:31.290 に答える
5

このステートメント y = --x--;は、 でのコンパイル時に次のエラーを返しますClvalue required. これは、post decrement operator -- がrvalue変数 x の操作後に を返すためです。そのため、デクリメント前の演算子を実行する左辺値はありません-その後。

しかし、これはCC++が異なる点の 1 つです。次Cのステートメントでも同じエラーが発生しますlvalue required

y = (--x)--;

しかしC++、ステートメントy = (--x)--;では正常にコンパイルされ、の値y7. C とは異なり、C++ は、lvalue変数 x に対して pre decrement 演算子を実行した後に を返すためです。

于 2013-07-03T05:17:27.767 に答える
3

L Value@Pavelで説明されているように、Lvalueはオブジェクトではなく値になっているため、エラーが発生しています。

--x意味x = x-1しますが、あなたの場合、--7どちらが同等で7 =7-1あるかは間違いなく有効な式ではありません。

これ以外に、間にシーケンス ポイントがない同じ変数に対して複数の操作を行うと、未定義の動作が発生します。

于 2013-07-03T05:20:50.280 に答える
1

コンパイラの動作がわからないので、一度に使用しないでください。したがって、コードをガイドして、好きなことを強制的に実行させる必要があります。

今、あなたのポイントに来てください。値を 1 減らしたい場合は、a--またはを使用できます--a。彼らも同じことをします。a = 5 を使用するb=a--と、値がすぐに割り当てられ、ステートメントが完了した後に値が割り当てられます。あなたが明確であることを願っています。b = 5 and a = 4b=--ab = 4 and a = 4--aa--

割り当て可能な適切な変数が見つからない場合に表示される L value required エラー。

于 2013-07-03T06:23:48.817 に答える
1

C の操作順序は、後置演算子が前置演算子よりも優先されることを指定します。後--置演算子は、オペランドの現在の値 (右辺値) を返し、オペランドをデクリメントします。次に、接頭辞のデクリメント演算子が適用されます...ただし、デクリメント/インクリメント演算子は、定義によりオペランドを変更するため、左辺値オペランドが必要です。したがって、コンパイラが言うように、左辺値が必要です。

于 2013-07-03T05:20:09.150 に答える