wordpress考试系统插件,sem优化方法,网站上传面板,做旅游网站的要求今天来学习C中的前置操作符#xff08;i#xff09;与后置操作符#xff08;i#xff09;。
一回顾
以前在C语言的理论课程中#xff0c;我们就学过#xff0c;前置和后置操作符#xff0c;有一定的区别#xff1a;
但是我们可以看到下图#xff0c;发现前置和后…今天来学习C中的前置操作符i与后置操作符i。
一回顾
以前在C语言的理论课程中我们就学过前置和后置操作符有一定的区别
但是我们可以看到下图发现前置和后置的操作符所对应的汇编语言14行和16行所对应的的汇编完全一样是完全一样的在linux下的eclipse软件中进行Debug调试 这是为什么呢难道之前学的C语言的理论是错的么并不是的这里面首先这两个i经过前后置后并没有被用起来结果是什么也并不重要所以现代的编译器软件就对程序进行优化将这两行语句优化成一样的
但是这也产生了一些意想不到的事
优化使得最终的二进制程序更加高效优化后的二进制程序丢失了C/C原有的语义不可能从编译后的二进制程序还原C/C程序。
二拓展
问题 那么操作符可以被重载么能够重载的话又是如何区分前置与后置的
回答 操作符可以被重载
全局函数和成员函数都可以被重载重载前置操作符不需要额外的参数重载后置操作符需要一个int类型的占位参数
下面我们还是来直接写一个代码来分析会更加清晰
#include iostream
#include stringusing namespace std;class Test
{int mValue;
public:Test(int i){mValue i;}int value(){return mValue;}Test operator () //这里返回的是对象的引用可以对比下面后置的返回值{mValue; //前置操作符效率高一些因为没有生成额外的对象就不需要在栈空间//占用额外的空间节省了内存并且不需要调用构造函数以及析构函数return *this; //返回当前对象的指针}Test operator (int) //这里为什么返回的不是引用呢因为后置是先需要把值保存起来然后再自加一所以这里需要一个局部对象把 { //值保存在这个Test ret(mValue); //先保存值mValue; //临时局部的对象中所以返回值就是类对象的值。再return ret; }
};int main()
{Test t(0);Test tt t;cout tt.value() endl;cout t.value() endl;cout endl;Test tt2 t;cout tt2.value() endl;cout t.value() endl;return 0;
}运行结果为 0 1
2 2
分析
程序注释中对于操作符的重载已经讲解的很清楚。
由打印结果知前两个值为0,1后置操作符先把值给tt再自己这保持了后置操作符的原生语义。同理由后两个打印语句得知前置操作符的原生语义也被保持了。
那么这两个重载的操作符真正的区别在哪里呢
-对于基础类型的变量
前置与后置的操作符的效率基本相同根据项目组编码规范进行选择 -对于类类型的对象前置的效率高于后置的效率具体原因看程序注释尽量使用前置的操作符提高程序的效率
3延伸
那么我们现在就可以来再次完善我们之前实现的复数类了具体代码整个代码过长我就放到码云平台大家可以自行下载。 点击下载点击下载复数类源码
4总结
编译优化使得最终的可执行程序更加高效前置操作符与后置操作符都可以被重载操作符的重载必须符合其原生语义对于基础类型前置和后置操作符效率几乎一样对于类类型前置的效率高于后置的效率
想一起探讨以及获得各种学习资源加我有我博客中写的代码的原稿 qq1126137994 微信liu1126137994 可以共同交流关于嵌入式操作系统C语言C语言数据结构等技术问题。