青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

隨筆 - 10  文章 - 0  trackbacks - 0
<2025年9月>
31123456
78910111213
14151617181920
21222324252627
2829301234
567891011

靜心學習,好好珍惜身邊的人。

常用鏈接

留言簿(1)

隨筆分類

隨筆檔案

搜索

  •  

積分與排名

  • 積分 - 3829
  • 排名 - 1720

最新評論

閱讀排行榜

評論排行榜

If you've been programming in either C or C++ for a while, it's likely that you've heard the terms lvalue (pronounced "ELL-value") and rvalue (pronounced "AR-value"), if only because they occasionally appear in compiler error messages. There's also a good chance that you have only a vague understanding of what they are. If so, it's not your fault.

Most books on C or C++ do not explain lvalues and rvalues very well. (I looked in a dozen books and couldn't find one explanation I liked.) This may be due to of the lack of a consistent definition even among the language standards. The 1999 C Standard defines lvalue differently from the 1989 C Standard, and each of those definitions is different from the one in the C++ Standard. And none of the standards is clear.

Given the disparity in the definitions for lvalue and rvalue among the language standards, I'm not prepared to offer precise definitions. However, I can explain the underlying concepts common to the standards.

As is often the case with discussions of esoteric language concepts, it's reasonable for you to ask why you should care. Admittedly, if you program only in C, you can get by without understanding what lvalues and rvalues really are. Many programmers do. But understanding lvalues and rvalues provides valuable insights into the behavior of built-in operators and the code compilers generate to execute those operators. If you program in C++, understanding the built-in operators is essential background for writing well-behaved overloaded operators.

Basic concepts
Kernighan and Ritchie coined the term lvalue to distinguish certain expressions from others. In The C Programming Language (Prentice-Hall, 1988), they wrote "An object is a manipulatable region of storage; an lvalue is an expression referring to an object....The name 'lvalue' comes from the assignment expression E1 = E2 in which the left operand E1 must be an lvalue expression."

In other words, the left and right operands of an assignment expression are themselves expressions. For the assignment to be valid, the left operand must refer to an object-it must be an lvalue. The right operand can be any expression. It need not be an lvalue. For example:

int n;

declares n as an object of type int. When you use n in an assignment expression such as:

n = 3;

n is an expression (a subexpression of the assignment expression) referring to an int object. The expression n is an lvalue.

Suppose you switch the left and right operands around:

3 = n;

Unless you're a former Fortran programmer, this is obviously a silly thing to do. The assignment is trying to change the value of an integer constant. Fortunately, C and C++ compilers reject it as an error. The basis for the rejection is that, although the assignment's left operand 3 is an expression, it's not an lvalue. It's an rvalue. It doesn't refer to an object; it just represents a value.

I don't know where the term rvalue comes from. Neither edition of the C Standard uses it, other than in a footnote stating "What is sometimes called 'rvalue' is in this standard described as the 'value of an expression.'"

The C++ Standard does use the term rvalue, defining it indirectly with this sentence: "Every expression is either an lvalue or an rvalue." So an rvalue is any expression that is not an lvalue.

Numeric literals, such as 3 and 3.14159, are rvalues. So are character literals, such as 'a'. An identifier that refers to an object is an lvalue, but an identifier that names an enumeration constant is an rvalue. For example:

enum color { red, green, blue };
color c;
...
c = green;    // ok
blue = green;    // error

The second assignment is an error because blue is an rvalue.

Although you can't use an rvalue as an lvalue, you can use an lvalue as an rvalue. For example, given:

int m, n;

you can assign the value in n to the object designated by m using:

m = n;

This assignment uses the lvalue expression n as an rvalue. Strictly speaking, a compiler performs what the C++ Standard calls an lvalue-to-rvalue conversion to obtain the value stored in the object to which n refers.

Lvalues in other expressions
Although lvalues and rvalues got their names from their roles in assignment expressions, the concepts apply in all expressions, even those involving other built-in operators.

For example, both operands of the built-in binary operator + must be expressions. Obviously, those expressions must have suitable types. After conversions, both expressions must have the same arithmetic type, or one expression must have a pointer type and the other must have an integer type. But either operand can be either an lvalue or an rvalue. Thus, both x + 2 and 2 + x are valid expressions.

Although the operands of a binary + operator may be lvalues, the result is always an rvalue. For example, given integer objects m and n:

m + 1 = n;

is an error. The + operator has higher precedence than the = operator. Thus, the assignment expression is equivalent to:

(m + 1) = n;    // error

which is an error because m + 1 is an rvalue.

As another example, the unary & (address-of) operator requires an lvalue as its operand. That is, &n is a valid expression only if n is an lvalue. Thus, an expression such as &3 is an error. Again, 3 does not refer to an object, so it's not addressable.

Although the unary & requires an lvalue as its operand, it's result is an rvalue. For example:

int n, *p;
...
p = &n;    // ok
&n = p;    // error: &n is an rvalue

In contrast to unary &, unary * produces an lvalue as its result. A non-null pointer p always points to an object, so *p is an lvalue. For example:

int a[N];
int *p = a;
...
*p = 3;     // ok

Although the result is an lvalue, the operand can be an rvalue, as in:

*(p + 1) = 4;    // ok

Data storage for rvalues
Conceptually, an rvalue is just a value; it doesn't refer to an object. In practice, it's not that an rvalue can't refer to an object. It's just that an rvalue doesn't necessarily refer to an object. Therefore, both C and C++ insist that you program as if rvalues don't refer to objects.

The assumption that rvalues do not refer to objects gives C and C++ compilers considerable freedom in generating code for rvalue expressions. Consider an assignment such as:

n = 1;

where n is an int. A compiler might generate named data storage initialized with the value 1, as if 1 were an lvalue. It would then generate code to copy from that initialized storage to the storage allocated for n. In assembly language, this might look like:

one: .word 1
...
mov (one), n

Many machines provide instructions with immediate operand addressing, in which the source operand can be part of the instruction rather than separate data. In assembly, this might look like:

mov #1, n

In this case, the rvalue 1 never appears as an object in the data space. Rather, it appears as part of an instruction in the code space.

On some machines, the fastest way to put the value 1 into an object is to clear it and then increment it, as in:

clr n
inc n

Clearing the object sets it to zero. Incrementing adds one. Yet data representing the values 0 and 1 appear nowhere in the object code.

posted on 2008-12-15 10:43 GLORY 閱讀(539) 評論(0)  編輯 收藏 引用 所屬分類: C/C++ Specification
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            国产精品嫩草99av在线| 久久久亚洲欧洲日产国码αv| 欧美va天堂va视频va在线| 亚洲综合欧美日韩| 中文国产亚洲喷潮| 亚洲欧美国产va在线影院| 午夜久久久久久| 久久精品三级| 欧美成人免费播放| 欧美日韩在线另类| 国产欧美日韩| 亚洲夫妻自拍| 在线视频欧美精品| 亚洲欧洲av一区二区| 欧美中文字幕第一页| 免费人成网站在线观看欧美高清 | 国产一区在线观看视频| 国外精品视频| 亚洲裸体在线观看| 亚洲女性喷水在线观看一区| 久久久www| 亚洲国产岛国毛片在线| 亚洲福利精品| 亚洲免费视频在线观看| 久久久久久精| 欧美午夜宅男影院| 亚洲高清二区| 欧美一级淫片aaaaaaa视频| 欧美成人在线免费观看| 亚洲无人区一区| 久久综合激情| 国产精品亚洲欧美| 亚洲精品一区二区在线| 久久九九全国免费精品观看| 91久久综合亚洲鲁鲁五月天| 午夜日韩视频| 欧美视频精品一区| 亚洲精品国产精品乱码不99 | 欧美一区二区黄色| 亚洲国产精品久久久久婷婷884| 亚洲一区二三| 欧美日本一区二区三区| 永久域名在线精品| 久久国产精品第一页| 亚洲精品一区中文| 蜜月aⅴ免费一区二区三区 | 亚洲免费视频一区二区| 欧美精品综合| 亚洲国产欧美日韩精品| 久久久福利视频| 亚洲图片欧美午夜| 欧美久久精品午夜青青大伊人| 在线免费不卡视频| 99视频一区二区三区| 久久久免费精品视频| 国产乱码精品一区二区三区忘忧草| 亚洲精品乱码久久久久久蜜桃麻豆 | 欧美一区二区黄| 亚洲图片欧美午夜| 国产精品劲爆视频| 亚洲自拍偷拍麻豆| 一区二区毛片| 国产精品久久久久久久9999| 亚洲一区欧美一区| 一区二区三区不卡视频在线观看| 欧美麻豆久久久久久中文| 亚洲日本va午夜在线电影| 欧美激情视频在线免费观看 欧美视频免费一 | 久久中文字幕导航| 久久国产精品黑丝| 伊人色综合久久天天| 免费久久99精品国产| 久久久久久综合网天天| 亚洲国产成人av在线| 欧美国产丝袜视频| 欧美黄色免费| 亚洲一区一卡| 欧美亚洲尤物久久| 亚洲第一视频| 亚洲另类视频| 国产农村妇女毛片精品久久莱园子 | 亚洲欧美精品一区| 国产欧美一区二区三区视频| 久久久av毛片精品| 久久亚洲综合色| 在线综合亚洲欧美在线视频| 亚洲女性裸体视频| 在线国产欧美| 日韩亚洲国产精品| 国产日本欧美一区二区三区在线| 免播放器亚洲一区| 欧美日韩精品久久| 久久精品国产99国产精品| 另类综合日韩欧美亚洲| 一区二区三区视频免费在线观看| 亚洲一区二区三区久久 | 欧美日韩一区二区三区视频| 先锋资源久久| 免费久久99精品国产| 亚洲一区二区三区影院| 日韩视频在线你懂得| 欧美三级特黄| 亚洲精品欧美激情| 蜜臀久久99精品久久久久久9| 136国产福利精品导航| 欧美高清一区二区| 欧美日韩国产成人在线| 欧美在线免费观看亚洲| 免费亚洲电影在线| 亚洲欧美日韩另类| 久久精品久久99精品久久| 亚洲精品在线看| 亚洲欧美日韩人成在线播放| 亚洲国产精品久久久久秋霞不卡| 在线视频日韩| 亚洲国产精品久久久久秋霞蜜臀| 亚洲永久字幕| 一区二区三区 在线观看视频| 欧美在线观看视频| 亚洲天堂成人在线观看| 狂野欧美一区| 久久精品日韩一区二区三区| 欧美日韩亚洲视频| 亚洲高清在线精品| 国产视频一区在线观看| 99pao成人国产永久免费视频| 黑丝一区二区三区| 亚洲女爱视频在线| 亚洲精选91| 免费亚洲一区| 欧美成人黄色小视频| 国产视频一区在线观看| 午夜精品福利在线| 亚洲欧美日韩一区二区三区在线观看 | 亚洲国产日韩欧美综合久久| 国产网站欧美日韩免费精品在线观看 | 一区二区三区毛片| 欧美肥婆在线| 欧美国产在线电影| 亚洲国产综合视频在线观看| 久久精品主播| 老鸭窝毛片一区二区三区| 国产视频一区在线观看| 午夜精品久久久久久99热软件| 亚洲免费小视频| 欧美日韩无遮挡| 99热免费精品| 亚洲女同在线| 亚洲一级二级在线| 亚洲一区二区精品| 国产精品高精视频免费| 一区二区三区www| 午夜在线精品| 国产欧美欧洲在线观看| 午夜视频一区| 美玉足脚交一区二区三区图片| 狠狠色狠狠色综合日日小说| 久久久久久尹人网香蕉| 亚洲国产欧美一区二区三区久久| 亚洲精品自在久久| 欧美日韩国产综合久久| 国内外成人免费激情在线视频| 亚洲已满18点击进入久久| 欧美精品免费在线观看| 亚洲黄色性网站| 一卡二卡3卡四卡高清精品视频| 欧美激情视频免费观看| 亚洲精品日韩久久| 欧美一区1区三区3区公司| 国产一本一道久久香蕉| 久久久久久亚洲精品杨幂换脸| 欧美福利电影网| 亚洲特级片在线| 国内成人精品2018免费看| 欧美成人综合在线| 亚洲午夜在线| 欧美69视频| 亚洲女同在线| 亚洲国产一区二区三区a毛片| 亚洲国产视频一区二区| 宅男噜噜噜66一区二区66| 国产区二精品视| 欧美.www| 亚洲自拍偷拍福利| 亚洲第一黄网| 久久aⅴ国产欧美74aaa| 亚洲精品中文字幕女同| 国产日韩亚洲欧美精品| 欧美精品免费观看二区| 西瓜成人精品人成网站| 亚洲人人精品| 美腿丝袜亚洲色图| 欧美一级黄色网| 日韩亚洲在线| 伊伊综合在线| 国产性做久久久久久| 欧美色图首页| 欧美精品123区| 久久手机精品视频| 欧美一区免费视频|