永发信息网

李星辰在哪?过来

答案:5  悬赏:40  手机版
解决时间 2021-08-15 01:37
关于x++怎么理解???
最佳答案

这道题出的有问题呀

全部回答
赋值运算需要左值,而x++不是左值。x++的本意是使用x的值,在使用后将x自加1,那么如果把x++用在赋值运算的左边的话,赋值时是赋给原先的x还是自加后的x呢?显然是未定义的,所以这种操作是错误的。下面转一篇关于左值和右值的文章,相信会对你帮助很大的。 左值(lvalue)和右值(rvalue)是编程中两个非常基本的概念,但是也非常容易让人误解,看了很多文章,自我感觉真正将这个问题讲的很透彻的文章还没有看见,所以自告奋勇来尝试一下。如果左值右值的概念不是非常清楚的话,它们迟早会像拦路虎一样跳出来,让你烦心不已,就像玩电脑游戏的时候每隔一段时间总有那么几个地雷考验你的耐性,如果一次把所有地雷扫尽就好了。:) 左值(lvalue)和右值(rvalue)最先来源于编译理论(感谢南大小百合的programs)。在C语言中表示位于赋值运算符两侧的两个值,左边的就叫左值,右边的就叫右值。比如: int ii = 5;//ii是左值,5是右值 int jj = ii;//jj是左值,ii是右值 上面表明,左值肯定可以作为右值使用,但反之则不然。左值和右值的最早区别就在于能否改变。左值是可以变的,右值不能变。【注1】 注1:这一点在C++中已经猪羊变色,不再成立。拱猪游戏还是挺好玩的,我还真抓过好几次全红心,不过真的好险。:) 在很多文章中提到,在C++中,左值更多的指的是可以定位,即有地址的值,而右值没有地址。【注2】 注2:这一点仍然不准确,我在程序中生成一个临时右值std::vector(),你能够说它没有地址吗?难道它是没有肉体的鬼魂或幽灵?它是有地址的,而且它也是绝对的右值。 在现代C++中,现在左值和右值基本上已经失去它们原本所具有的意义,对于左值表达式,通过具体名字和引用(pointer or reference)来指定一个对象。非左值就是右值。我来下一个定义: 左值表示程序中必须有一个特定的名字引用到这个值。 右值表示程序中没有一个特定的名字引用到这个值。 跟它们是否可以改变,是否在栈或堆(stack or heap)中有地址毫无关系。 1.左值 在下面的代码中: int ii = 5; int const jj = ii; int a[5]; a[0] = 100; *(a+3) = 200; int const& max( int const& a, int const& b ) //call by reference { return a > b ? a : b; } int& fun(int& a) //call by reference { a += 5; return a; } ii,jj,a[0],*(a+3),还有函数max的返回值比如max(ii, jj),【注3】函数fun的返回值fun(ii)都是左值。,它们都是有特定的引用名字的值。ii,jj,a[0],*(a+3),max(ii, jj),fun(ii)分别就是它们的名字。 注3:在这里有一个不太容易分清楚的盲点。那就是有人会问max(8, 9)到达是左值还是右值,C++标准规定常量引用(reference to const)可以引用到右值,所以max(8, 9)似乎应该是右值,不过不管它是左值,还是右值,我们都不能试图去改变它。为了与前面的概念一致,我认为它是左值,不可改变的常量左值。 左值有不能改变的,即被const所修饰的左值,比如上面的jj,max(ii, jj)都是被常量(const)魔咒所困住的左值。 没有被const困住的左值当然是可以改变的,比如下面的代码都是成立的: ii = 600; a[0] = 700; fun(ii) = 800; //OK! 我们的眼睛没有问题,fun(ii) = 800;完全正确,因为它是可以改变的左值。所以我们看STL的源码,就会理解std::vector中的重载operator[]运算符的返回值为什么要写成引用,因为operator[]必须返回左值。 2.右值 没有特定名字的值是右值。先看下面的代码: std::list(); std::string(“It is a rvalue!”); int fun1() //call by value { … } int* fun2() //call by reference { … } 其中std::list(),std::string(“It is a rvalue!”),函数fun1的返回值fun1(),函数fun2的返回值fun2()都是右值,它们的值都没有特定的名字去引用。也许有人会奇怪,fun2()也是右值?最前面的max(a,b)不是左值吗? 请看清楚,函数fun2的返回值是pointer,pointer也是call by value,而函数max的返回值是reference,reference是call by reference。所以说C++中引入reference不仅仅是为了方便,它也是一种必须。【注4】 注4:Scott Meyer写的《More Effective C++》的条款1专门讲了pointer和reference的区别,写的很好,辨别的非常清楚。 fun2()是右值,但 *fun2()却是左值,就跟经常看到的*p一样,所以看C++库代码的时候,会发现重载operator*的函数返回值是reference。 当然我还遗漏了一种右值,那就是字面上的(literal)值,比如5,8.23,’a’等等理所当然的都是右值。 右值最初出现的时候,一个最大的特征就是不可改变。但就跟我们的道德标准一样,时代不同了,标准也变化了,以前的三纲五常早已经被扔到历史的垃圾堆里面了。 C++中有可以改变的右值,而且这个特性还非常有用。那就是用户自定义的类(class)的构造函数生成的临时对象。比如: std::vector(9),std::deque(),……都是可以改变的右值。在Herb Sutter的《More Exceptional C++》中的条款7的page51页有这样几行代码: // Example 7-2(b): The right way to shrink-to-fit a vector. vector<Customer> c( 10000 ); // ...now c.capacity() >= 10000... // erase all but the first 10 elements c.erase( c.begin()+10, c.end() ); // the following line does shrink c's // internal buffer to fit (or close) vector<Customer>( c ).swap( c ); // ...now c.capacity() == c.size(), or // perhaps a little more than c.size() 认真看几遍,你会发现但vector的大小增大到一定程度,你又用不着这么多空间的时候,你会想办法把它收缩到最合适的大小,但利用别的办法比如调用成员函数reserve()都无法办到,这个时候就必须利用右值可以改变这个性质了。 vector<Customer>( c ).swap( c );这行代码就是点睛之处。 首先使用复制构造函数生成临时右值vector<Customer>( c ),这个右值正好是合适大小,然后和c交换【注5】,c就变成合适大小了,最后在整个表达式结束的时候,这个临时右值析构归还内存空间。真是绅士一般的优雅! 注5:这个时候这个临时右值就发生了改变。 如果还不理解,可以看看书,或者直接看库的源代码。 至于为什么会这样?我思考了一下,我想是这样的,我们看类(class)的数据布置结构,会发现它的每一个数据成员都是有名字的,我想编译器在编译的过程中,都会生成一个外部不所知的对这个临时对象右值的名字引用,但需要改变这个临时对象的时候,这个名字就用上了。比如: class Point { public: //纯粹为了方便,我把数据成员公开,现实中尽量不要这样用 int x, y ,z; ……//其他各种成员函数 }; 我们现在就可以改变右值,用到了匿名的引用名字。 Point().x = 6;//改变了右值 Point().y = 6;//同意改变了右值,不过注意,这个右值跟上面的不是同一个。 总结 左值和右值的真正区别我想就是这些了,左值表示有特定的名字引用,而右值没有特定的名字引用。当然我仍然会有疏忽,希望大家能够提醒我,指正我的不足。 前两天看Herb Sutter从邮件中寄来的新文章(我订阅他的新文章邮件通知),一篇是讲Tuple数据结构的,没有什么新意,以前好像看过,还有一篇名字是:(Mostly)Private,地址为 http://www.cuj.com/documents/s=8273/cujcexp2107sutter/ 内容本身并不深,但看完文章,发现随处可见C++的波诡云谲,又会对什么叫袖里乾坤,滴水藏海多一份感性认识。参考资料: http://blog.sina.com.cn/s/blog_4cbd7d4701000a1n.html
不是我!不过你有什么不明白的可以问我!
呃,还有这问题…在中国…你要他过来他还不一定过来呢…
爪子?
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
QQ三国。人物密码忘了怎么找回来?
坐月子都要注意些什么?
想买一些咖啡,但是不知道韩国咖啡好喝 还是东
问下青岛英语培训机构有哪些
什么朋友之间 就可以放开倾诉
火影现在的漫画出到控制九尾之后显示出鸣人的
哔了狗是什么意思,哔了狗了🐶 什么意
有什么好听的歌伐,伤感的也可以?
洛龙区洛阳灵宝肉夹馍我想知道这个在什么地方
关于如何漏洞修复的问题?
偷影子的人的读后感,读《偷影子的人》观后感
为什么我的JJ插进去她不疼也没出血我也没有夹
为西游记写一篇读书笔记50zi
要在哪里才可以搜到《我和狗狗的十个约定》电
元前面是耳朵旁读什么字
推荐资讯
建华区齐齐哈尔新龙门客栈(中华南路)在什么地
我开通是200高级群会员,现在还按一百普通群
寻找一款配置比较合理,价钱适中,携带轻便的
这世界没有钱了,地球还能转吗?
谁能给我一份热能与动力工程专业的毕业论文?
武穴市黄冈荣事达智能晾衣设备地址在哪里啊
CF有几多少人在玩?有几个人爆级?
农场菜被好友摘了第一时间你做的是什么…
虽然武艺把陈翔PK下了台、但是武艺心里也不好
大明龙权破军最好的战魂
qq的安全等级为零是会怎么样
暖暖阳光照进我的心房 英文翻译?
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?