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