誰かがcの左辺値と右辺値について適切な説明をしてくれませんか? 私は適切なものを見つけていません。誰かがリンクを持っている場合は、コメントとして貼り付けてください。
6 に答える
左辺値は、アドレス (通常は例外: レジスタ変数) を取得できるエンティティであり、名前で参照するのに十分な長さでメモリに存在します。
r値は、アドレスを取得できない変数オブジェクトであり、名前で参照できるほど長くメモリに存在せず、名前がありません。多くの場合、名前のない一時オブジェクトとも呼ばれます。
int returnanInteger()
{
int i = 10;
return i;
}
void doSomething(int i)
{
//do something, right now we don't care
}
int main()
{
int i = 20;
doSomething(returnanInteger());
return 0;
}
上記のプログラムでは、アドレスを取得でき、名前で参照できるため、i
inmain()
は左辺値です。
一方、声明では:
doSomething(returnanInteger());
によって返される値はreturnanInteger()
右辺値であり、そのアドレスを取得することはできず、名前で参照するのに十分な時間メモリに残りません。すぐにコピーされて、引数として関数に渡されますdoSomething()
。
malloc
単純化すると、変数、複合リテラル、または同様のメカニズムを介して、プログラムで明示的な割り当てを持つ型付きの「オブジェクト」として左辺値を表示できます。型に応じて、左辺値は変更可能または変更不可 (const
型に対して で指定) になり、そのアドレスを取得できるかどうか (register
変数の宣言に対して で指定) が許可される場合があります。
右辺値は、プログラムが評価の中間ステップとして生成する単なる「値」であり、コンパイラは最適な特定の表現を自由に選択できます。右辺値は変更できず、通常はそのアドレスを取得できません。(配列コンポーネントの評価に使用できる非常に特殊な状況があります。)
Als が既に上で述べたこと (十分に詳細です) に加えて、次のリンクが役立つ場合があります。
= の右側にあるすべての値 (C プログラミングでは "equal" は符号に等しい) は右辺値です。Like x = 23; c = 'x'; int *ptr = &x;
ここで 23 , 'x' と '&x" は右辺値です. これに対応して x , c と *ptr は左辺値です. これらはメモリ内の変数またはオブジェクトを表します. 右辺値を = の左側に置くことはできません. c プログラミングにサインイン)
詳細については、 http://www.devx.com/tips/Tip/5696のリンクを参照 してください。rgds ソフティ