3

左辺値について私が読んだいくつかの定義を次に示します

  1. & 演算子で使用できる式。つまり、&(expression) がエラーでない場合、式は左辺値です。

  2. 一時的ではないオブジェクトになる式

  3. 左辺値式は = 演算子の右辺と左辺の両方で使用できます

  4. 右辺値式は RHS でのみ使用できます

間違っていたら訂正してください

これが質問です

++x は左辺値であり、x++ は右辺値です。

int i = 0;
printf("%p",(void*)&++i);

もしそうなら、なぜこれはエラーですか?

lhs で左辺値式を使用できる場合

int i = 0;
++i = 10;

上記のステートメントを使用できないのはなぜですか??上記の両方でエラーが発生しています

更新: 上記のステートメントは両方とも C++ で問題ありません

4

5 に答える 5

4

++i左辺値でもそうでもありませんi++

*x++および*++xどちらも左辺値である (x にポインター型がある場合)について考えているかもしれません。

于 2013-05-06T13:23:00.053 に答える
3

++iC++lvalueのみであり、Cでは代入できない (C 標準では式の値と呼ばれる) です。rvalue

于 2013-05-06T13:21:54.313 に答える
2

この質問は締め切ろうと思い、コメントだけ残しました。なんて大きな間違いです;)

C (質問のタグはCです) ++i 演算子は値を「返します」が、変数自体は返しません。したがって、そのアドレスは取得できません。つまり++i、左辺値ではありません。どちらでもないi++

C++ は、特定の構成要素が l 値および r 値であるという点で C とは異なる場合があります。

http://eli.thegreenplace.net/2011/12/15/understanding-lvalues-and-rvalues-in-c-and-c/

C++ の場合、これら 2 つは左辺値です。

この簡単なコード:

#include <stdio.h>

int main() {
  int i=0;
  ++i = 10;
  printf("\n%d\n", i);
  ++i = ++i;
  printf("%d\n", i);
}

gcc でコンパイルすると、次のようになります。

lvalue.c:3: error: invalid lvalue in assignment
lvalue.c:4: warning: incompatible implicit declaration of built-in function ‘printf’
lvalue.c:5: error: invalid lvalue in assignment

g ++の場合、正しくコンパイルされ、次のようになります。

10
12
于 2013-05-06T13:32:17.403 に答える
1

C11 からの (ややあいまいな) 正式な定義:

(太字の強調は私が追加したものです)

6.3.2.1 左辺値、配列、および関数指定子

左辺値は、潜在的にオブジェクト(64)を指定する ( void 以外のオブジェクト型を持つ) 式です。左辺値が評価時にオブジェクトを指定しない場合、動作は未定義です。オブジェクトが特定の型を持つと言われる場合、その型は、オブジェクトを指定するために使用される左辺値によって指定されます。変更可能な左辺値は、配列型を持たず、不完全な型を持たず、const 修飾された型を持たず、構造体または共用体である場合、メンバー (再帰的にメンバーを含む) を持たない左辺値です。または、含まれているすべての集約または共用体の要素) を const 修飾された型で指定します。

補足説明付きの脚注 (規範的ではありません):

64) 「左辺値」という名前は、最初は代入式 E1 = E2 に由来します。ここで、左オペランド E1 は (変更可能な) 左辺値である必要があります。オブジェクトの「ロケーター値」を表すと考えたほうがよいでしょう。「右辺値」と呼ばれることがあるものは、この国際標準では「式の値」として説明されています。

したがって、左辺値は「潜在的に」オブジェクトを指定するものでなければなりません。「潜在的に」が何を意味するにせよ、個人的な解釈は自由です...

上記の脚注にもかかわらず、C 標準には右辺値の正式な定義がありません。皮肉なことに、標準全体で右辺値に言及している唯一の場所は、その 1 つの脚注です。

あなたの場合、 ++i も i++ も実際のオブジェクトを指定していないため、どちらも左辺値ではありません。それらはむしろ右辺値です。

于 2013-05-06T13:40:35.987 に答える