需要注意變數作用域的使用

2021-09-05 14:32:42 字數 1350 閱讀 8119

對於變數的作用域大家可能都很清楚,即變數的作用域包含定義它們的**塊和直接巢狀在其中的**塊。其實也可以應用到其他**塊上,例如分之和迴圈的**塊上,但是這裡有乙個需要注意的地方,請看下面這個例子:

1for(i=0

;i<

10;i++)

3",text);

6console.writeline(

"last text output in loop:

",text);

編譯會發現,編譯通不過,而且報出錯誤「

名稱「text」在類或命名空間「ch06ex03.class1」中不存在」,這裡比較容易理解,因為在for迴圈外確實沒有定義text變數,在退出迴圈後就被釋放掉了,再使用它就是使用了乙個未定義的變數所以會報錯。我們修改一下,請看下乙個例子:

1string

text;

3for(i=0

;i<

10;i++)

4",text);

7console.writeline(

"last text output in loop:

",text);

我們在迴圈塊外定義的變數text,這樣可以在console.writeline時引用到這個變數,但是編譯時還是會報錯「

使用了未賦值的區域性變數「text」」,這個錯誤是提示變數在使用前要被宣告並初始化。這樣我們就看到了這個例子中的問題,變數text是在for迴圈塊中被初始化的,而賦給text變數的值在退出迴圈塊時就丟失了。在迴圈體中程式認為text變數有值,而我們確實也為其賦值了,而在退出迴圈後程式確認為text變數沒有被賦值,這是因為變數text是在迴圈體中被初始化的,這個初始化僅在迴圈塊中起作用,在推出迴圈後就又變回沒有被初始化的狀態,所以會報錯。我們再進行一次修改:

1string

text =""

;3for(i=0

;i<

10;i++)

4",text);

7console.writeline(

"last text output in loop:

",text);

這時,程式會正常編譯通過,而且text也是在外部被宣告並初始化,而使用時也是在變數相應的作用域中。

對於這種情況的解釋,其實涉及在初始化變數text時分配給變數text的記憶體空間,其實任何變數都是這樣的。僅是對於變數的宣告,系統並不會分配給它相應的記憶體空間,系統僅是知道以後將會使用到這個變數。只有在給這個變數進行初始化或賦值時(其實第一次賦值就是對變數的初始化),系統在真正按照宣告時變數的型別給變數分配相應的儲存空間。就像本例中一樣,在迴圈時對變臉進行了初始化操作,這時在迴圈執行過程中,這個變數佔據了一塊系統分配給它的儲存空間,但是一旦退出迴圈,系統就收回了這塊儲存空間,所以會出現這種錯誤。

學習Angular中作用域需要注意的坑

angular作用域 在用angular搭建的網頁應用中,作用域 scope 這個概念是貫穿其中的。在angular的檢視 view 中的很多指令是會建立乙個作用域的,例如 ng app ng controller 等。這個作用域就是我們在寫控制器建構函式時注入的 scope angular1.2之...

使用SqlSession 需要注意的

sqlsessionfactorybuilder 是用於建立sqlseesionfactory的,將sqlsessionfactorybuilder當成乙個工具類來使用 sqlseesionfactory 會話工廠,是乙個單例的,用於建立sqlsession,sqlsessionfactory一旦建...

IOS開發需要注意的property變數宣告

在ios開發中,變數的宣告有2種比較常用,我這裡說說它們的區別 一般大家喜歡在標頭檔案中宣告property,然後在m檔案synthsize,dealloc中release。這種做法比較多,但很多新手不知道其中的風險,這裡解釋一下。在開發中,如果這個類有需要暴露給外部呼叫的,可以採用property...