版權(quán)歸原作者所有,如有侵權(quán),請(qǐng)聯(lián)系我們

[科普中國(guó)]-函數(shù)副作用

科學(xué)百科
原創(chuàng)
科學(xué)百科為用戶提供權(quán)威科普內(nèi)容,打造知識(shí)科普陣地
收藏

函數(shù)副作用是指函數(shù)在正常工作任務(wù)之外對(duì)外部環(huán)境所施加的影響。具體地說(shuō),函數(shù)副作用是指函數(shù)被調(diào)用,完成了函數(shù)既定的計(jì)算任務(wù),但同時(shí)因?yàn)樵L問(wèn)了外部數(shù)據(jù),尤其是因?yàn)閷?duì)外部數(shù)據(jù)進(jìn)行了寫(xiě)操作,從而一定程度地改變了系統(tǒng)環(huán)境。函數(shù)的副作用也有可能是發(fā)生在函數(shù)運(yùn)行期間,由于對(duì)外部數(shù)據(jù)的改變,導(dǎo)致了同步運(yùn)行的外部函數(shù)受到影響。1

簡(jiǎn)述所謂函數(shù)副作用是指,當(dāng)調(diào)用函數(shù)時(shí),被調(diào)用函數(shù)除了返回函數(shù)值之外,還對(duì)主調(diào)用函數(shù)產(chǎn)生附加的影響。例如,調(diào)用函數(shù)時(shí)在被調(diào)用函數(shù)內(nèi)部:

·修改全局量的值;

·修改主調(diào)用函數(shù)中聲明的變量的值(一般通過(guò)指針參數(shù)實(shí)現(xiàn))。

函數(shù)副作用會(huì)給程序設(shè)計(jì)帶來(lái)不必要的麻煩,給程序帶來(lái)十分難以查找的錯(cuò)誤,并且降低程序的可讀性。例如,由于雙目運(yùn)算的兩個(gè)運(yùn)算分量的計(jì)算次序不同,而帶來(lái)運(yùn)算結(jié)果不同,就是由函數(shù)副作用引起的。對(duì)函數(shù)副作用的看法與對(duì)GOTO語(yǔ)句的看法一樣,在程序設(shè)計(jì)語(yǔ)言界一直有分歧,有人主張保留,有人主張取消。探測(cè)認(rèn)為,可以保留函數(shù)副作用,但是應(yīng)該限制程序員盡量不要使用函數(shù)副作用。由于函數(shù)副作用的影響,會(huì)產(chǎn)生以下問(wèn)題。

·會(huì)使雙目運(yùn)算的結(jié)果依賴于兩個(gè)運(yùn)算分量的計(jì)算次序;

·還可能使某些在數(shù)學(xué)上明顯成立的事實(shí),在程序中就不一定成立。2

表現(xiàn)從語(yǔ)言的函數(shù)設(shè)計(jì)可以看到,函數(shù)能夠無(wú)條件訪問(wèn)全局?jǐn)?shù)據(jù)(包括全局變量、全局?jǐn)?shù)組、全局靜態(tài)數(shù)據(jù)),通過(guò)指針或引用參數(shù)訪問(wèn)主調(diào)函數(shù)的棧數(shù)據(jù)或者屬于程序整體的堆數(shù)據(jù),甚至系統(tǒng)全局堆數(shù)據(jù)。函數(shù)副作用正是通過(guò)函數(shù)訪問(wèn)這些數(shù)據(jù)所表現(xiàn)出來(lái)的。

1、良性副作用

通過(guò)指針或引用參數(shù)設(shè)計(jì)的函數(shù),都具有訪問(wèn)外部數(shù)據(jù)的傾向?;蛟S可以利用某個(gè)函數(shù)對(duì)外部數(shù)據(jù)的修改,簡(jiǎn)化或免于后續(xù)計(jì)算的工作。例如:

//=================//X0 814.cpp//函數(shù)副作用(模擬庫(kù)函數(shù)gets)//==========#includeusing namespace std;//----------------int len; //串長(zhǎng)//----------------char* getStr (char*s) {len=0;while(cin>s [Len]&&s[len])len++;return S;}//----------------int main() {char a[100]jcout