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

隨筆 - 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>
            久久激情五月丁香伊人| 国产一区二区三区观看| 亚洲免费婷婷| 亚洲在线视频网站| 亚洲欧美日韩天堂| 亚洲女人天堂av| 香蕉亚洲视频| 久久久777| 欧美精品导航| 国产精品高潮呻吟久久av无限| 国产精品高潮呻吟久久av黑人| 国产精品自拍在线| 很黄很黄激情成人| 99re热这里只有精品免费视频| av成人免费在线观看| 欧美精品情趣视频| 亚洲欧美另类中文字幕| 久久精品午夜| 欧美va天堂va视频va在线| 亚洲第一免费播放区| 免费91麻豆精品国产自产在线观看| 免费看亚洲片| 中文有码久久| 玖玖玖国产精品| 欧美日韩亚洲三区| 激情自拍一区| 亚洲午夜电影网| 久久只精品国产| av成人老司机| 欧美 日韩 国产在线| 国产精品一区二区久久久久| 亚洲黄色影片| 久久精精品视频| 日韩一级免费| 免费一级欧美在线大片| 国产午夜亚洲精品理论片色戒| 最新日韩在线| 久久嫩草精品久久久久| 亚洲桃花岛网站| 欧美激情按摩在线| 国内视频一区| 欧美在现视频| 亚洲视频在线观看免费| 欧美大片国产精品| 伊人成人在线| 久久性色av| 欧美一区二区在线免费播放| 国产精品啊v在线| 日韩一二三区视频| 亚洲第一毛片| 欧美成人高清视频| 亚洲国产精品v| 麻豆国产va免费精品高清在线| 亚洲欧美日韩国产成人| 国产精品每日更新在线播放网址| 日韩视频在线免费| 亚洲精品护士| 欧美精品一区二区三区四区| 亚洲日本欧美天堂| 欧美粗暴jizz性欧美20| 久久伊人免费视频| 亚洲国产精品第一区二区三区| 久久亚洲综合色| 久久精品国产亚洲高清剧情介绍| 国产精品伦一区| 午夜综合激情| 亚洲一区二区三区乱码aⅴ蜜桃女| 国产精品啊v在线| 香蕉尹人综合在线观看| 亚洲欧美久久久久一区二区三区| 国产九九视频一区二区三区| 国产欧美在线看| 亚洲宅男天堂在线观看无病毒| 亚洲国产精品电影在线观看| 欧美激情精品久久久久久| 亚洲精品一区二区三区婷婷月| 欧美激情无毛| 欧美日韩大陆在线| 亚洲欧美国产毛片在线| 亚洲欧美日韩在线不卡| 国产自产2019最新不卡| 欧美不卡激情三级在线观看| 欧美成人在线免费观看| 亚洲一区二区精品视频| 欧美一区成人| 亚洲国产另类久久久精品极度| 亚洲国产成人av在线 | 亚洲午夜激情| 国产精品久久久久久久app| 欧美在线视频日韩| 久久久综合免费视频| 99国产精品| 午夜精品久久久久久久蜜桃app| 精品999日本| 99在线精品观看| 国产一区91| 91久久精品网| 国产揄拍国内精品对白| 欧美国产丝袜视频| 国产精品久久久久影院色老大| 久久久www成人免费无遮挡大片| 欧美a级一区| 久久国产精品黑丝| 欧美日韩成人综合天天影院| 久久一区中文字幕| 国产精品视频福利| 亚洲国产清纯| 狠狠色狠狠色综合日日91app| 亚洲精品乱码久久久久| 国模套图日韩精品一区二区| 99国产精品| 亚洲国产高潮在线观看| 午夜精品福利一区二区三区av| 日韩一二三在线视频播| 久久中文欧美| 欧美在线播放高清精品| 欧美日韩国产一级片| 免费影视亚洲| 国产综合香蕉五月婷在线| 亚洲天堂男人| 亚洲一区二区在线看| 免费观看亚洲视频大全| 久久久久久久久伊人| 国产精品日韩精品| 亚洲精品在线视频观看| 亚洲高清在线观看| 久久噜噜亚洲综合| 久久精品九九| 国产日韩综合| 欧美亚洲一级片| 久久精品国产99| 国产欧美日韩视频| 亚洲男人第一网站| 久久国产精品久久久久久电车| 国产精品超碰97尤物18| 亚洲免费观看视频| 欧美性猛交xxxx乱大交退制版| 亚洲黄色一区二区三区| 亚洲日本中文字幕| 欧美成人高清视频| 欧美激情视频网站| 亚洲欧洲一区| 欧美精品日韩| 91久久精品国产91久久| 日韩视频在线一区二区| 欧美午夜视频一区二区| 亚洲永久网站| 久久久久久亚洲精品不卡4k岛国| 国产亚洲一级| 久久久久久有精品国产| 欧美高清在线| 99国产精品久久久久老师| 欧美日韩在线播放一区二区| 一区二区三区久久网| 午夜精品免费| 国内精品久久久久久久影视麻豆 | 欧美日韩 国产精品| 亚洲精品孕妇| 午夜一级久久| 亚洲国产1区| 欧美日韩一区二区三区免费看| 99综合在线| 久久久久9999亚洲精品| 亚洲国产成人午夜在线一区| 欧美日韩在线看| 亚洲综合精品一区二区| 免费欧美在线| 亚洲一二三区精品| 国模大胆一区二区三区| 欧美全黄视频| 欧美一区二区三区视频免费| 亚洲第一区在线| 午夜精品久久久久久| 国语自产在线不卡| 欧美日韩国产91| 欧美一区2区视频在线观看| 亚洲电影专区| 久久精品亚洲精品国产欧美kt∨| 亚洲精品欧美在线| 国产一本一道久久香蕉| 欧美日韩国产一区二区三区| 久久久久**毛片大全| 一区二区动漫| 亚洲国产精品一区| 久久夜色精品国产亚洲aⅴ| 一区二区三区精品视频| 极品尤物一区二区三区| 国产精品亚洲综合色区韩国| 欧美激情影音先锋| 久久视频在线视频| 午夜精品区一区二区三| 日韩一区二区电影网| 欧美大片免费观看在线观看网站推荐 | 欧美中文字幕在线观看| 亚洲精品国精品久久99热一| 麻豆精品视频在线观看| 欧美在线亚洲在线| 销魂美女一区二区三区视频在线| 一本大道久久精品懂色aⅴ| 91久久国产综合久久|