左值(LValue)和右值(RValue)的一个快捷记法是赋值运算,左值是赋值运算左边的值,右值就是右边(=,=废话)。例如:

int a = 5;

a就是左值,5就是右值。

当然,如果真是这么个含义,那么这概念就相当蛋疼了。其实不是这样的~~

左值其实是对一块内存区域的引用(这个还不是C++中的int &a之类的引用),比如上边的a,就对应了一块内存区域(起始地址为&a,大小为sizeof(int))。

更专业的定义在这里:

An object is a region of storage that can be examined and stored into. An lvalue is an expression that refers to such an object. An lvalue does not necessarily permit modification of the object it designates. For example, a const object is an lvalue that cannot be modified.

lvalue不一定允许修改,如const int a,a也是一个左值,只不过在定义const类型必须初始化,为什么,如果不初始化,后面

想要对其赋值:

int a=5;

由于a是const,不能赋值,所以必须在定义时初始化

右值对应的玩意其实也在内存里,但是我们忽略这一点,认为它存在于冥冥之中。例如上边那个5,其实它在静态数据段或者程序二级制代码中,但我们不关心这个,认为它无法修改。

附个链接:

http://publib.boulder.ibm.com/infocenter/comphelp/v7v91/index.jsp?topic=%2Fcom.ibm.vacpp7a.doc%2Flanguage%2Fref%2Fclrc05lvalue.htm

记住:

++i是左值,i++是右值。

因为++i 返回 i 本身,而 i++ 返回 i 的值。

int i=0;

++i=5;
cout<<i<<endl; //5

一篇文章:

左值和右值的区别:

1. 概念变量和文字常量都有存储区,并且有相关的类型,区别在于变量是可寻址的;

对于每个变量,都有2个值与其相关联:

1>数据值,存储在某个内存地址中,也称右值(rvalue),右值是被读取的值(read value),文字常量和变量都可被用于右值

2>地址值,即存储数据值的那块内存地址,也称左值(lvalue),文字常量不能被用作左值。

2 . 问题给表达式加上括号:

++a--

结果 ++(a--)

这个表达式是非法的,因为前增量操作要求一个可修改的左值,而 "a--" 不是左值(即右值)

3 . 前增量和后增量的区别

早期的c语言教材,for循环语句通常写成:

for(int i=0;i<10;i++)

而现在多为:

for(int i=0;i<10;++i) 两者有区别吗?

a++ 即是返回 a的值,然后变量 a 加 1,返回需要产生一个临时变量类似于

{ int temp = a;

a=a+1;

return temp; //返回右值 }

++a 则为:

{ a=a+1;

return &a; //返回左值 }

显然,前增量不需要中间变量,效率更高

  int m=;
for(int i=;i<=;i++){
m=m++;
}

m=m++,可以这样理解,首先看后面,m在前,是先用再加,m一直在用,所以每次赋值都无效!!!所以一直还是原来的值,即0。 理论上应该为0,但是实际上输出::100.

为什么:

如果是c++的话,值为100,

如果是java,为0.

深入解释:

http://www.oschina.net/question/12_8120

总结的是C++和java 结果不一样.呵呵

貌似所有C++编译器都是在整个;语句表达式结

如果改成++m;

值为100.

 int m=;
for(int i=1;i<=;i++){
m=i++;

输出:99,为什么?

当i=99时,m=99,然后i加1,为100,然后i++变成101,101超出100,退出。

下一题:

int m=;
for(int i=;i<;i++)
m=i++;
cout<<m<<endl;

输出:98

i=98的时候,执行自加,m=98。这个时候,在循环体里面的i已经达到99了,加完后再回到for表达式的自加,i变成100,进入判断i<100,不再执行循环,推出。 点评,这个,,,很容易搞错成100或者99。

int m=;
for(int i=;i<;i++)
m=++i;
cout<<m<<endl;

4)和3道理一样,i到98,因为是先加再用,最后一次i=98,加1后为99,所以最终m=99.点评,这个和(3)一样容易搞错。

参考:http://nannan408.iteye.com/blog/1238745

http://wenku.baidu.com/view/84460478168884868762d664.html

i++和++i以及左值,右值的更多相关文章

  1. c++ 左值右值 函数模板

    1.先看一段代码,这就是一种函数模板的用法,但是红色的部分如果把a写成a++或者写成一个常量比如1,都是编译不过的,因为如果是a++的话,实际上首先是取得a的 值0,而0作为一个常量没有地址.写成1也 ...

  2. C++ 左值 右值

    最近在研究C++ 左值 右值,搬运.收集了一些别人的资料,供自己记录和学习,若以后看到了更好的解释,会继续补充.(打“?”是我自己不明白的地方 )   参考:<Boost程序库探秘——深度解析C ...

  3. C++ 左值与右值 右值引用 引用折叠 => 完美转发

    左值与右值 什么是左值?什么是右值? 在C++里没有明确定义.看了几个版本,有名字的是左值,没名字的是右值.能被&取地址的是左值,不能被&取地址的是右值.而且左值与右值可以发生转换. ...

  4. 左值&右值

    一.引子 我们所谓的左值.右值,正确的说法应该是左值表达式.右值表达式. 因为C++的表达式不是左值就是右值. 在C中,左值指的是既能够出现在等号左边也能出现在等号右边的表达式,右值指的则是只能出现在 ...

  5. C++11之右值引用(一):从左值右值到右值引用

    C++98中规定了左值和右值的概念,但是一般程序员不需要理解的过于深入,因为对于C++98,左值和右值的划分一般用处不大,但是到了C++11,它的重要性开始显现出来. C++98标准明确规定: 左值是 ...

  6. C语言几个术语: 数据对象,左值,右值

    1. 数据对象 赋值表达式语句的目的是把值存储到内存位置上. 用于存储值的数据存储区域统称为数据对象. 2. 左值 左值是C语言的术语, 用于标识特定数据对象的名称或表达式. 对象指的是实际的数据存储 ...

  7. C和C指针小记(八)-操作符、左值右值

    1.移位操作符 移位操作符分为左移操作符(<<)和右移操纵符(>>) 对于无符号数:左右位移操作都是逻辑位移 对于有符号数:到底是采用逻辑位移还是算术位移取决于编译器.如果一个 ...

  8. C++中的左值与右值(二)

    以前以为自己把左值和右值已经弄清楚了,果然发现自己还是太年轻了,下面的这些东西是自己通过在网上拾人牙慧,加上自己的理解写的. 1. 2. 怎么区分左值和右值:知乎大神@顾露的回答. 3. 我们不能直接 ...

  9. C语言 左值、右值

    左值就是在赋值中可以放在赋值操作符两边的值 右值则是只可以放在赋值操作符右边的值 ++i是直接给i变量加1,然后返回i本身,因为i是变量,所以可以被赋值,因此是左值表达式i++现产生一个临时变量,记录 ...

随机推荐

  1. move.js

    function startMove(obj,json,fn){ var flag=true;//标志所有运动是否到达目标值 clearInterval(obj.timer); obj.timer=s ...

  2. HDU 11488 Hyper Prefix Sets (字符串-Trie树)

    H Hyper Prefix Sets Prefix goodness of a set string is length of longest common prefix*number of str ...

  3. Nice way for strip_tags a like

    I found this code works great as the function strip_tags in php to replace html tags from string and ...

  4. c 跟字符串有关的函数

    1.字符串查找 strstr char * strstr(const char *s1, const char *s2); 在s1中查找s2,如果找到返回首个s2的首地址 char * strcase ...

  5. [学习笔记]js动画实现方法,作用域,闭包

    一,js动画基本都是依靠setInterval和setTimeout来实现 1,setInterval是间隔执行,过一段时间执行一次代码 setInterval(function(){},500);即 ...

  6. iOS网络开发-AFNetworking请求asp.net WebService

    看到园子有位朋友需要使用AFN框架请求 WebService,所以就整理了一下,demo下载链接在底部 编写WebService可以看这篇博客 http://www.cnblogs.com/linmi ...

  7. POST 方式上传图片

    Post 方式 模仿 form表单 上传 图片 设置enctype = multipart/form-data <form enctype="multipart/form-data&q ...

  8. result 相关

    1.dispatcher 2.redirect 3.chain 4.redirectAction 5.freemarker 6.httpheader 7.stream 8.velocity 9.xsl ...

  9. Matlab常用小技巧及部分快捷键

    Matlab常用小技巧一: 1. m文件如果是函数,保存的文件名最好与函数名一致,这点都很清楚.不过容易疏忽的是,m文件名的命名尽量不要是简单的英文单词,最好是由大小写英文/数字/下划线等组成.原因是 ...

  10. iOS实战(零):开发社区、文档等资源

    社区 Apple官方资源 Xcode文档库: Window->Documentation and API Reference (可以在xcode的Preferences中下载最新的文档) iOS ...