下面的兩個源代碼蜕该,希望實現(xiàn)的功能是傳入一個參數(shù)0,通過三次循環(huán)剖毯,每次在循環(huán)體內(nèi)加3圾笨,輸出的結(jié)果賦值給一個數(shù)值顯示控件。通過代碼的結(jié)果逊谋,來看看隧道和移位寄存器到底有什么區(qū)別擂达。
在循環(huán)結(jié)構(gòu)的左右兩邊的小實心正方體表示了這條通道為隧道,對隧道點擊右鍵后可將其替換為移位寄存器胶滋,如圖二板鬓。另外悲敷,切記移位寄存器必定成對出現(xiàn),否則程序會出現(xiàn)編譯錯誤俭令。
改程序編譯運行后后德,得到的結(jié)果卻迥然不同。圖一的隧道程序循環(huán)執(zhí)行3次后輸出的結(jié)果仍未3抄腔,而圖二的移位寄存器程序循環(huán)執(zhí)行3次后如愿以償?shù)牡玫搅?這個值瓢湃,其原理在于:
a) 隧道是一個局部變量值,每次進入循環(huán)體都會被循環(huán)體外部賦予一個初始值赫蛇,所以即使圖一的循環(huán)執(zhí)行了3次绵患,但是每一次隧道的左入口的值都為0,在循環(huán)體內(nèi)加3后悟耘,隧道的右出口值為3落蝙,即使執(zhí)行N次也是這樣。
b) 移位寄存器的值稍微不同暂幼,每一次在循環(huán)體內(nèi)執(zhí)行筏勒,每次都會把右邊移位寄存器出口的值用作左邊入口的值,因此執(zhí)行3次以后得到了9粟誓。
正如上文提到奏寨,熟悉C/C++的同學應(yīng)該會想到了,這就是我們所熟悉的局部變量和靜態(tài)局部變量的區(qū)別嘛鹰服!是的,隧道相當于每次進來循環(huán)體之后把循環(huán)體外的值賦予循環(huán)體內(nèi)的局部變量揽咕,所以不管循環(huán)體內(nèi)執(zhí)行幾次悲酷,其結(jié)果也等同于只執(zhí)行了一次。然而移位寄存器相當于加了static的靜態(tài)局部變量亲善,我們知道靜態(tài)局部變量是不會壓棧的设易,因此它的值會隨著每次循環(huán)體的執(zhí)行而往上累加。