1

C では、rvalues と lvalues を識別する方法はありますか?

それらのいくつかは簡単に識別できます。たとえば、割り当てでは、左側の値が左辺値で、右側の値が右辺値です。

しかし、他のシナリオでは、そのようなルールによる識別は困難です。

例: *p++ and i++(p は整数へのポインターで、i は整数) - 右辺値か左辺値かを識別する方法は? コンテキストは++*p++機能しますが、右辺値である++i++ため機能しません(真面目な人が言ったように)。i++

式で右辺値と左辺値を識別する方法は?

4

3 に答える 3

3

lvalueという用語は C で使用されています (C++ に引き継がれ、後で拡張されました)。そもそも右辺値はありませんでした。私が持っている草案 (N1570) には、右辺値という用語の 2 つの出現箇所がリストされています。脚注 #64 で 1 回、索引で 1 回です。

一言で言えば、C の世界では、左辺値とその他すべての 2 種類のオブジェクトがあります。

脚注は標準の一部ではありませんが、有用な洞察を提供できることに注意してください。脚注 64 を次に示します。

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

左辺値のわかりやすい例は、オブジェクトの識別子です。さらなる例として、E がオブジェクトへのポインターである単項式である場合、*E は、E が指すオブジェクトを指定する左辺値です。

これにより、良いスタートが切れます。ここで、式はオブジェクト (および演算子ですが、後で説明します) から構築されることを覚えておいてください。オブジェクトを扱う際には、型と値という 2 つの基本的なことを考慮する必要があります。次に、型の制限について標準が何を言っているか見てみましょう (6.3.2.1/p1):

左辺値は、潜在的にオブジェクトを指定する (void 以外のオブジェクト型を持つ) 式です。64) 左辺値が評価時にオブジェクトを指定しない場合、動作は未定義です。

また、重要な次の行に注意してください。

オブジェクトが特定の型を持つと言われる場合、その型は、オブジェクトを指定するために使用される左辺値によって指定されます。

そのため、左辺値を型の代わりに使用できます (これも後で説明します)。次に、オブジェクトが左辺値であるコンテキストを見てみましょう(6.3.2.1/2):

sizeof 演算子、_Alignof 演算子、単項 & 演算子、++ 演算子、-- 演算子、または . 演算子または代入演算子

したがって、これらは注意が必要な演算子です。その他の場合:

配列型を持たない左辺値は、指定されたオブジェクトに格納されている値に変換されます (左辺値ではなくなります)。これは左辺値変換と呼ばれます。

配列と関数指示子の 2 つの特殊な型があります。これらの減衰は、つまり、配列オブジェクトの最初の要素を指し、左辺値/ 「型を返す関数へのポインター」ではない型「型へのポインター」を持つ式に変換されます(左辺値が型として機能するという事実について一時停止したことを思い出してください。これはまさに、左辺値がandで行うことです!)sizeof_Alignof

于 2012-06-19T17:20:17.330 に答える
2

メモリ(またはレジスタ)ストレージを参照し、値を割り当てることができるものの左辺値左側(LHS)値から)。*p++間接参照ポインタであるため(つまり、それ自体ptrの値がptrその場所のアドレスであるのに対し、メモリ内の場所を指します)、++*ptr++実際には次のことを意味*ptr = *ptr + 1; ptr = ptr + 1;しますptr。-が指す値をインクリメントしてから、ポインタ値をインクリメントします。自体。1ずつ増加する値であり、メモリ内の場所を参照しないためi++、は左辺値ではありません。iこのような値はfinalと考えることができます。これ以上変更することはできず、左辺値に割り当てる値としてのみ使用できます。。そのため、これらは右辺値(右側(RHS)値から)と呼ばれます。

LHSとRHSは、代入式の両側を参照しますA = B;AはLHSでBあり、はRHSです。

于 2012-06-19T16:49:36.857 に答える
0

ダイテルとダイテルから:

変数名は、代入演算子の左側で使用できるため、左辺値(「左の値」) と呼ばれます。定数は、代入演算子の右側でのみ使用できるため、右辺値 (「正しい値」) と呼ばれます左辺値は右辺値としても使用できますが、その逆はできないことに注意してください。

x = 3;  /*  here, x is an lvalue */
c = x;  /*  and in the next line it is an rvalue */
于 2012-06-19T16:55:46.820 に答える