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

隨筆 - 10  文章 - 0  trackbacks - 0
<2008年10月>
2829301234
567891011
12131415161718
19202122232425
2627282930311
2345678

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

常用鏈接

留言簿(1)

隨筆分類

隨筆檔案

搜索

  •  

積分與排名

  • 積分 - 3838
  • 排名 - 1718

最新評論

閱讀排行榜

評論排行榜

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 閱讀(540) 評論(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>
            极品中文字幕一区| 在线视频精品一区| 亚洲三级色网| 亚洲精品乱码久久久久久黑人| 在线看片一区| 91久久亚洲| 一区二区三区毛片| 亚洲在线中文字幕| 久久精品国产一区二区电影| 久久这里只有精品视频首页| 欧美黄色精品| 99综合精品| 欧美在线播放高清精品| 久久综合网色—综合色88| 欧美理论在线播放| 国产欧美日韩在线视频| 在线电影欧美日韩一区二区私密| 亚洲黄色在线看| 亚洲欧美视频一区| 久久久久网站| 亚洲精品免费看| 亚洲综合电影| 久久―日本道色综合久久| 欧美精品在线观看| 国产日韩精品一区二区三区| 亚洲激情另类| 久久频这里精品99香蕉| 亚洲美女诱惑| 蜜桃av综合| 一本大道久久a久久精品综合| 久久精品网址| 国产精品国产成人国产三级| 亚洲欧洲一区二区三区久久| 久久精品盗摄| 一区二区三区欧美在线| 老司机免费视频一区二区| 国产欧美一区二区三区久久| 亚洲另类视频| 欧美二区在线观看| 欧美在线视频观看| 国产精品尤物| 亚洲欧美日韩区| 日韩亚洲欧美在线观看| 免费在线亚洲| 亚洲国产一区二区三区高清| 久久久久久久久久久久久久一区 | 久久精品国产99国产精品| 亚洲精品日本| 欧美国产专区| 亚洲黄色大片| 欧美成人午夜77777| 欧美自拍偷拍午夜视频| 国产精品视频专区| 亚洲欧美在线aaa| 亚洲深夜激情| 国产精品视频不卡| 亚洲欧美日韩一区| 一本色道久久综合亚洲精品小说| 欧美激情偷拍| 一区二区三区高清在线观看| 亚洲欧洲日本国产| 欧美日韩国产影片| 亚洲视频在线观看视频| av成人天堂| 国产欧美一区二区白浆黑人| 久久久国产91| 久热精品在线视频| 亚洲精品视频一区| 亚洲激情综合| 欧美婷婷在线| 欧美在线关看| 久久一本综合频道| 亚洲人成人一区二区在线观看| 亚洲高清三级视频| 欧美日韩性生活视频| 亚洲在线视频一区| 欧美在线视频观看| 91久久久一线二线三线品牌| 日韩视频免费大全中文字幕| 国产精品久久久一区二区三区| 欧美有码在线视频| 老司机成人在线视频| 在线亚洲一区| 久久精品在线| 宅男噜噜噜66国产日韩在线观看| 亚洲一区国产| 在线日韩成人| 一本色道久久综合亚洲精品按摩 | 国语自产偷拍精品视频偷| 久久综合久久综合这里只有精品 | 欧美一区二区三区婷婷月色| 欧美诱惑福利视频| 亚洲精品在线三区| 亚洲视频日本| 亚洲黄色天堂| 午夜精品久久久| 亚洲免费av片| 久久精品二区| 亚洲中字黄色| 欧美va天堂va视频va在线| 午夜日韩激情| 欧美激情精品| 狼人社综合社区| 国产精品久久看| 亚洲国产婷婷| 黑人一区二区| 亚洲一区二区在| 亚洲天堂久久| 欧美成人一区二区在线| 久久精品噜噜噜成人av农村| 欧美日韩情趣电影| 欧美成人影音| 激情91久久| 午夜精品国产| 午夜一区在线| 欧美日韩中文在线观看| 欧美高清一区二区| 国产主播一区二区三区四区| 亚洲视频中文| 一区二区国产精品| 欧美第十八页| 欧美岛国激情| 在线欧美小视频| 久久久99免费视频| 久久精品人人做人人综合| 欧美午夜性色大片在线观看| 最近看过的日韩成人| 亚洲国产高清自拍| 久久久亚洲国产天美传媒修理工| 欧美一区二区三区四区高清| 国产精品v片在线观看不卡| 亚洲日韩欧美视频一区| 亚洲精品免费网站| 久久野战av| 欧美国产一区二区| 亚洲电影第三页| 麻豆精品视频在线观看| 久热精品在线视频| 在线精品福利| 欧美成人一区二区三区在线观看| 欧美国产日韩在线| 99国内精品久久| 欧美日韩另类一区| 亚洲校园激情| 欧美资源在线观看| 国产有码在线一区二区视频| 欧美在线一二三| 免费人成精品欧美精品| 亚洲高清自拍| 亚洲激情电影在线| 亚洲特黄一级片| 国产欧美一区二区白浆黑人| 欧美一区二区三区免费观看| 久久夜色精品国产| 亚洲风情亚aⅴ在线发布| 美日韩精品免费| 亚洲狼人精品一区二区三区| 亚洲午夜一区二区| 国产欧美精品一区二区色综合 | 亚洲欧洲日产国产网站| 亚洲视频网站在线观看| 国产乱子伦一区二区三区国色天香| 欧美一区二区三区喷汁尤物| 欧美大成色www永久网站婷| 夜夜爽99久久国产综合精品女不卡| 国产精品www网站| 久久激情五月激情| 亚洲精选大片| 久久久久久一区二区| 最新精品在线| 国产精品日日摸夜夜摸av| 久久成人在线| 99国产精品国产精品久久| 久久精品国产清高在天天线| 亚洲毛片av| 国产亚洲精品bt天堂精选| 欧美a级片网站| 亚洲专区欧美专区| 亚洲电影专区| 久久精品国产一区二区三区免费看 | 99国产精品久久久| 国产亚洲一区二区三区| 欧美激情四色| 久久久福利视频| 亚洲一区二区精品在线观看| 亚洲电影毛片| 久久亚洲风情| 亚洲欧美日韩中文视频| 日韩视频在线一区二区| 韩国av一区二区三区| 国产精品成人一区二区三区吃奶| 欧美阿v一级看视频| 久久国产视频网| 亚洲一区日韩| 在线亚洲成人| 亚洲精品一区二| 亚洲电影视频在线| 欧美sm重口味系列视频在线观看| 欧美在线网站| 欧美一站二站|