總會有一個(gè)人需要你的分享~!- 唐風(fēng) -
先看下面這一段程序:
這段程序的輸出結(jié)果,多多少少讓人感覺有點(diǎn)意外。 我們先看下面這句:
按慣常的思維來說,我們認(rèn)為的結(jié)果是第一次輸出 0 ,第二次輸出也是 0 ,之后,變量 i 的值變成 1 。 但實(shí)際上,第一次輸出了 1 ,第二次輸出的是 0 。 為什么呢?原來在一個(gè)語句中,如果存在多個(gè)函數(shù)調(diào)用,那么參數(shù)值會從右到左處理一遍,之后再從左到右調(diào)用每個(gè)函數(shù)。從右到左處理參數(shù)是為了滿足 C/C++ 的變參數(shù)函數(shù)的要求,而從左到右的調(diào)用函數(shù)則是與書寫習(xí)慣相符合的。 那么,這個(gè)語句中,先把 i 的值賦給第二個(gè)輸出流操作符,然后進(jìn)行自加,再將 i 的值(自加之后的)賦給第一個(gè)輸出流操作符。結(jié)果和我們預(yù)想的“正常行為”就不太一樣了。 其實(shí)同樣的,如果這里不是用輸出流,而用 C 的printf ,比如:
在上面的情況下,程序的行為經(jīng)過解釋之后,我們還是能夠理解的。 第X、Y行的代碼行為,就難以解釋了。(我懷疑這是微軟編譯器的bug,呵呵) 第 45 行,fun3 得到的是 i 自加前的值,而第 47 行,fun3 得到的則是 i 自加后的值,兩者的區(qū)別只是因?yàn)榍耙粋€(gè)函數(shù)中,i 是值傳遞還是以引用傳遞。這一點(diǎn),只要看下對應(yīng)的匯編代碼就能進(jìn)行驗(yàn)證。總結(jié)下: 自加與自減表達(dá)式用在函數(shù)調(diào)用中,是非常容易產(chǎn)生副作用的。它所帶來的便利性比較小,但如果產(chǎn)生了隱蔽的 bug,則很難進(jìn)行查找和處理,可能花費(fèi)很多時(shí)間和精力。所以,至少在團(tuán)隊(duì)合作進(jìn)行開發(fā)時(shí),看情況適當(dāng)?shù)亟惯@種可能產(chǎn)生副作用的用法,是值得的。PS: 以上程序在VC2003和VC2008中驗(yàn)證。
Powered by: C++博客 Copyright © 唐風(fēng)