i++ 不能作为左值,而++i能 的原因

int 类型的++i与i++的实现, 注意i++的返回是 const int类型,由于oldValue是一个编译器自动分配的临时变量,并不是程序中定义的变量,返回的是一个数据值,而非地址,所以不能对它进行寻址(不能通过地址对它进行操作).第二,常量不能作为左值使用。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// 前缀形式:++i
int& int::operator++() //这里返回的是一个引用形式,就是说函数返回值也可以作为一个左值使用
{//函数本身无参,意味着是在自身空间内增加1的
*this += 1; // 增加
return *this; // 取回值

}


//后缀形式: i++
const int int::operator++(int) //这里的(int)是一个占位符
//函数返回值是一个非左值型的,与前缀形式的差别所在。
{//函数带参,说明有另外的空间开辟
int oldValue = *this; // 取回值
++(*this); // 增加
return oldValue; // 返回被取回的值

}

在自定义对象中,后置++要多生成一个局部对象 tmp,这个对象有可能包含很多的成员,因此执行速度比前置的慢。在次数很多的循环中,++i和i++可能就会造成运行时间上可观的差别了。因此,对循环控制变量i,要养成写++i、不写i++的习惯。

小端:数据高字节 放 内存高地址,操作系统在访问内存数据时是从低地址向高地址的顺序进行的。

a在栈区,(高地址)a[1]就对应m的高字节,(低地址)a[0]对应m的低字节. 0000 0001 000 1001 答案应该是266【十进制】

参考文章

http://www.bubuko.com/infodetail-210314.html

http://www.voidcn.com/article/p-dixrdrsg-bxk.html

https://blog.csdn.net/metheir/article/details/58708405

http://www.javashuo.com/article/p-uzugvwjp-km.html

---------------- 本文结束 ----------------

本文标题:i++ 不能作为左值,而++i能 的原因

文章作者:Pabebe

发布时间:2021年04月24日 - 18:46:00

最后更新:2021年09月12日 - 21:36:56

原始链接:https://pabebezz.github.io/article/ee51884a/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

0%