2012-08-12 29 views
5

據我所知,不純的函數是那些在用相同參數調用時並不總是返回相同的值的函數(我必須缺少某些東西,或者可能是錯誤的,如果我是這樣的話,請糾正我)。爲什麼printf()是一個不純的函數?

那麼,爲什麼printf()認爲不純的功能?

回答

15

不,「不純」功能副作用的功能。

換句話說,不管你有多少次調用它,純函數會影響什麼除了其輸出

例如,foo不純即使它返回零

int x; 
int foo() { x++; return 0; } 
int bar() { return x; } 

如果foo是純粹的,稱這是不會影響bar()結果。

printf是不純的,因爲它的結果有「副作用」 - 具體而言,它打印屏幕上的內容(或文件,等等)。
如果它是純的,那麼你可以稱它爲十億次,並確保沒有什麼不好的事情發生。
但是,如果你真的叫printf一萬次,有一定用戶的不同 - 它填補了他的屏幕(或磁盤空間,或其他)。很顯然這不是純粹的。此外:如果您的輸出被重定向爲您自己的輸入(有點沒用,但仍然),那麼調用printf會影響您從getchar收到的內容。 :)所以它也可以直接觀察到。

+3

雖然正確,但這個答案與'printf'無關。它也不涉及**爲什麼**'printf'不純(外部 - 與內部 - 副作用相對)。 – 2012-08-12 05:20:30

+0

是否所有的功能都是不純的。他們有時間去執行(哲學)! 順便說一句 - 'bar'返回x – 2012-08-12 05:21:07

+0

@DavidTitarenco:你說得對,我只是補充一點,謝謝! – Mehrdad 2012-08-12 05:23:08

7

作爲一個純函數有兩個部分。首先,如您所述,該函數必須始終爲相同的輸入參數返回相同的值。第二個標準,printf不能實現,是該函數不能有像I/O或對象變異這樣的副作用。

+1

'printf'甚至不符合第一個標準:它會成功**返回一些字符**。 – Vladimir 2012-08-12 07:12:20

+0

@Vladimir:每當你給出相同的輸入參數時,它總會返回相同的值(這是成功打印的字符數**)。那麼它是如何不滿足第一個標準的呢? – cirronimbo 2012-08-12 08:32:52

+0

返回的值可能會有所不同,具體取決於a)執行printf和b)寫入期間發生的錯誤。想象一下,如果標準輸出已關閉。這裏是一個例子:http://pastebin.com/HAtCm2Jh – Vladimir 2012-08-12 08:57:39

3

簡而言之,printf是不純的,因爲它確實I/O。根據定義,I/O是不純的,因爲存在設備的外部狀態(狀態可能隨着執行而不同)。

0

printf()是不純的,因爲它會導致輸出到I/O設備作爲副作用.....

1

的純函數編程的意義在於,實現可以優化出一個純函數的呼叫如果它已經具有使用相同參數調用該函數的結果。很明顯,對於printf調用是無法完成的。

P.S.即使通過您的定義,printf也是不純的,因爲它可以在成功時返回一個值,並且在出現I/O錯誤(例如輸出設備上的空間不足)時返回不同的值。

0

很多答案都解釋說printf有I/O作爲副作用,但printf也可能有其他副作用。例如,%n說明符允許printf寫入指定地址(並且是導致某些安全漏洞的原因)。

相關問題