當(dāng)前位置:首頁(yè) > 公眾號(hào)精選 > 嵌入式微處理器
[導(dǎo)讀]最近遇到了一個(gè)比較有意思的代碼: int main() { int i = 0; i = i++; //問(wèn)如果打印i的值,結(jié)果是多少? return 0; } 這個(gè)問(wèn)題實(shí)際上涉及到了前置及后置操作符的內(nèi)部實(shí)現(xiàn)問(wèn)題。 下面我們通過(guò)模仿前置和后置操作符的實(shí)現(xiàn)方式,來(lái)加深對(duì)前置、


最近遇到了一個(gè)比較有意思的代碼:


int main()
{
int i = 0;
i = i++;

//問(wèn)如果打印i的值,結(jié)果是多少?
return 0;
}


這個(gè)問(wèn)題實(shí)際上涉及到了前置及后置操作符的內(nèi)部實(shí)現(xiàn)問(wèn)題。


下面我們通過(guò)模仿前置和后置操作符的實(shí)現(xiàn)方式,來(lái)加深對(duì)前置、后置操作符實(shí)現(xiàn)原理的理解:


首先,我們使用類MyInt來(lái)模擬整型:


class MyInt{
public:
int value; //實(shí)際的value值

MyInt(int value){ //方便初始化:MyInt i = 0;
this->value = value;
}

/**
* 重寫前置式++運(yùn)算符(++i時(shí)會(huì)自動(dòng)調(diào)用本函數(shù))
* @return 前置式運(yùn)算會(huì)返回當(dāng)前對(duì)象的引用
*/

MyInt& operator++(){
*this += 1; //累加后取出
return *this;
}

/**
* 重寫后置式++運(yùn)算符(i++時(shí)會(huì)自動(dòng)調(diào)用本函數(shù))
* 注意:由于函數(shù)重載是以參數(shù)類型來(lái)區(qū)分的,而前置、后置運(yùn)算又都沒(méi)有參數(shù)。為了解決這個(gè)語(yǔ)言學(xué)上的漏洞,只好讓后置式運(yùn)算符有一個(gè)int類型的參數(shù)(調(diào)用時(shí),編譯器會(huì)默默地為這個(gè)int型參數(shù)指定0值)
* @return 返回一個(gè)const類型的對(duì)象
*/

const MyInt operator++(int){
MyInt oldValue = *this; //取出當(dāng)前對(duì)象
++(*this); //累加(調(diào)用上面的前置++的重載函數(shù))
return oldValue; //返回先前被取出的值
}

/**
* 重載運(yùn)算符+=,方便賦值操作:*this += 1;
*/

MyInt& operator+=(int value){
this->value = this->value + value;
return *this;
}

//MyInt &operator--(); //前置式--的實(shí)現(xiàn)與上面類似
//MyInt UPInt operator--(); //后置式--的實(shí)現(xiàn)與上面類似
};


有了上面的代碼,我們?cè)賮?lái)看main函數(shù)里的調(diào)用:


#include <.......>
#include "MyInt.h"
int main()
{
MyInt i = 0; //調(diào)用帶參構(gòu)造
++i; //調(diào)用 i.operator++() i的值為1
i++; //調(diào)用 i.operator++(0) i的值為2

return 0;
}


從上面的結(jié)果看,都是實(shí)現(xiàn)了值的自增1


回到開始的問(wèn)題:
(使用我們模擬實(shí)現(xiàn)的類)


int main()
{
MyInt i = 0;
i = i++;

//問(wèn)如果打印i的值,結(jié)果是多少?
return 0;
}


首先會(huì)調(diào)用i++,即 i.operator++(0),函數(shù)代碼如下:


    /**
* 重寫后置式++運(yùn)算符(i++時(shí)會(huì)自動(dòng)調(diào)用本函數(shù))
* @return 返回一個(gè)const類型的對(duì)象
*/

const MyInt operator++(int){
MyInt oldValue = *this; //注意:oldValue是*this的副本,不是引用
++(*this); //這里累加的是*this對(duì)象,而不是oldValue
return oldValue; //返回的oldValue值并沒(méi)有變化,仍然是初值
}


所以,i.operater++(0)執(zhí)行后,表達(dá)式就成了:i = 0,即


void main()
{
//1、i = i++;
//2、i.operator+=(i.operator++(0));
//3、i.operator+=(0) -> i += 0
//4、i = 0
}


i = i++ 運(yùn)行的結(jié)果就為0。

-END-




推薦閱讀



【01】TIOBE 8 月編程語(yǔ)言:C、Java 差距拉大,R 語(yǔ)言盛行
【02】單片機(jī)C語(yǔ)言,必知的數(shù)據(jù)存儲(chǔ)與程序編寫知識(shí)!
【03】C語(yǔ)言之父:因拒付論文裝訂費(fèi)錯(cuò)失博士學(xué)位,論文52年后重見天日
【04】C語(yǔ)言開發(fā)單片機(jī)為啥都是全局變量形式?
【05】分享10個(gè)值得關(guān)注的C語(yǔ)言開源項(xiàng)目


免責(zé)聲明:整理文章為傳播相關(guān)技術(shù),版權(quán)歸原作者所有,如有侵權(quán),請(qǐng)聯(lián)系刪除

免責(zé)聲明:本文內(nèi)容由21ic獲得授權(quán)后發(fā)布,版權(quán)歸原作者所有,本平臺(tái)僅提供信息存儲(chǔ)服務(wù)。文章僅代表作者個(gè)人觀點(diǎn),不代表本平臺(tái)立場(chǎng),如有問(wèn)題,請(qǐng)聯(lián)系我們,謝謝!

嵌入式ARM

掃描二維碼,關(guān)注更多精彩內(nèi)容

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。
關(guān)閉
關(guān)閉