1

-l 値と r 値について混乱していました。コードを検討する

int x; x=5;

整数×

メモリ空間は int 変数用に予約されています。次に、値 5 が割り当てられます。私の質問は

  1. 宣言は x が左辺値であることを意味しますか?
  2. x がメモリ内にアドレス 0xyyyy を持っている場合、&x はこのアドレスを参照します。このアドレス 0xyyy は左辺値、つまり &x は左辺値ですか? しかし、var のアドレスはポインタなので、l-value はポインタ変数になりますか?
4

5 に答える 5

2

私が理解している限り、左辺値は、代入できる式を表す単なる凝った用語です。言い換えれば、何かが = 演算子の左側に現れる場合、それは左辺値です。これはx左辺値であることを意味しますが、そうで&xはありません。x のアドレスを別のものに再割り当てすることはできません。

int* getIntPtr()thenのような関数がある場合getIntPtr()、左辺値ではありません (書き込みgetIntPtr() = 5は意味がありません) が、左辺値*(getIntPtr())です。

編集:明らかに、それはそれほど簡単ではありません。x が const として定義されている場合x、代入はできませんが、左辺値 (変更不可能な左辺値と呼ばれます) のままです。他の例外があるかどうかはわかりません。

于 2011-08-27T19:03:51.310 に答える
1

Anl-valueは代入の左側に意味があります。すべてl-valuesr-valuesです。メモリが必要かどうかは、l-value. さらに重要なのは、何かを保存できるメモリの場所に評価されるかどうかです。

int  x = 3;

x+5 = 7;    // error

x+5は ではありませんl-value

于 2011-08-27T19:06:25.443 に答える
1

lValue => 式のアドレスを取得できる場合、それは lValue です。

10 = a; // Can we take the address of 10 ?

rValue => Express のアドレスを取得できない場合は、rValue です。

a = 10;

まだいくつかの例外があります。たとえば、配列型はlValueであり、そのアドレスを取得したり割り当てたりすることはできません。

int a[5] ;  // &a => Not valid
a = /* some thing */  // Not valid
于 2011-08-27T19:14:03.633 に答える
0

皆さんは正しいですが、OPの質問にはもう少しあると思います。これも私を悩ませているものです。

それで

int x;

xは左辺値です。しかし、xとは正確には何ですか?ものを保存できる記憶の場所ですか?しかし、待ってください...それ&xは、左辺値ではありません。

もう1つの奇妙なことはx、メモリ内の場所さえ持つ必要がないことです. コンパイラは、それを常にレジスタに残すことを選択する場合があります。では、何がそれを左辺値にするのでしょうか?

要約する最善の方法は、 anlvalueはコンパイラが使用する概念ですが、ランタイムには表示されないということです。xコンパイラはそれができることを知っているので、左辺値である可能性があります

store $x %ax

(私はアセンブリ構文を構成します。長すぎます)

または、レジスターにあり、それができることを知っているかもしれません

move %bx %ax

基本的に、コンパイラは「it」に何かを格納する方法を知っているため、これは左辺値ですが、その「it」をつかむことはできません。

于 2011-08-27T19:13:34.443 に答える
0

明確にするために:まず、int x変数用のスペースを予約せず、変数についてコンパイラに通知するだけです。値がそれに割り当てられるとき、つまり私たちが行うとき、スペースは予約され、割り当てられますx=5;

さて、L値とR値の問題:

L-Value : 一定の値を代入できるものです。つまり、yesxは L 値です。できるからですx=5;。しかし、&xはできないので L 値ではありません&x=5;。同様に、0xyyyyはアドレスであり、R 値である可能性がありますが、割り当てられないため、L 値ではありません。

于 2011-08-27T19:15:23.367 に答える