首先定義全域性變數和區域性變數 如下
#import #import "scope.h"
int gglobalvar=300;
int main(int argc, const char * argv)
return 0;
}
2015-04-01 14:52:12.123 extern[1924:303] 300
2015-04-01 14:52:12.125 extern[1924:303] 400
從結果可以看出在沒有定義區域性變數之前 程式中顯示的是全域性變數的gglobalvar 當定義了新的區域性變數gglobalvar後 全域性變數被區域性變數覆蓋了 程式中顯示的是區域性變數的gglobalvar 這是兩個不同的gglobalvar 全域性變數存放在靜態儲存區 區域性變數存放在棧
再看外部全域性變數 如下
#import int gglobalvar=100;
@inte***ce scope : nsobject
-(void) setgglobalvar:(int)g;
-(int) gglobalvar;
@end
#import #import "scope.h"
//int gglobalvar=300;
int main(int argc, const char * argv)
return 0;
}
這裡在標頭檔案中定義全域性變數gglobalvar 編譯器會報錯 重複定義變數 這裡就要說到#import了 #import是預處理程式的一種 功能是匯入檔案 就像是檔案直接插入到#import語句所在的位置 由於標頭檔案要被其他檔案匯入 就不可避免會重複定義 所以一般情況之下 標頭檔案裡只能宣告 不能定義 修改一下 如下
#import int gglobalvar;
@inte***ce scope : nsobject
-(void) setgglobalvar:(int)g;
-(int) gglobalvar;
@end
#import #import "scope.h"
//int gglobalvar=300;
int main(int argc, const char * argv)
return 0;
}
2015-04-01 16:05:06.336 scope[2405:303] 0
2015-04-01 16:05:06.339 scope[2405:303] 100
2015-04-01 16:05:06.341 scope[2405:303] 400
這裡再用extern關鍵字宣告外部全域性變數也會報錯 顯示外部全域性變數被區域性變數覆蓋了 因為使用extern就相當於把外部全域性變數視作區域性變數處理 兩個區域性變數顯然報錯 這裡要訪問全域性變數gglobalvar可以使用方法 如下
#import "scope.h"
//int gglobalvar=200;
@implementation scope
-(void) setgglobalvar:(int)g
-(int) gglobalvar
@end
#import #import "scope.h"
//int gglobalvar=300;
int main(int argc, const char * argv)
return 0;
}
2015-04-01 16:27:36.858 scope[2502:303] 02015-04-01 16:27:36.861 scope[2502:303] 1002015-04-01 16:27:36.865 scope[2502:303] 4002015-04-01 16:27:36.866 scope[2502:303] 100
這樣就可以訪問被覆蓋的全域性變數gglobalvar 呼叫方法 方法之中有全域性變數gglobalvar但是我們一般都在實現檔案中去定義全域性變數 如下
#import "scope.h"
int gglobalvar=200;
@implementation scope
-(void) setgglobalvar:(int)g
-(int) gglobalvar
@end
#import #import "scope.h"
//int gglobalvar=300;
int main(int argc, const char * argv)
return 0;
}
2015-04-01 17:28:15.448 scope[2767:303] 200
2015-04-01 17:28:15.450 scope[2767:303] 100
2015-04-01 17:28:15.451 scope[2767:303] 100
這裡宣告區域性變數gglobalvar編譯器也會報錯 因為extern已經將外部全域性變數視作區域性變數 由於這樣的全域性變數可以被其他檔案訪問 破壞了資料封裝的原則 所以一般使用靜態變數 如下
#import "scope.h"
static int gglobalvar=200;
@implementation scope
-(void) setgglobalvar:(int)g
-(int) gglobalvar
@end
#import #import "scope.h"
//int gglobalvar=300;
int main(int argc, const char * argv)
return 0;
}
2015-04-01 18:39:19.266 scope[3118:303] 200
2015-04-01 18:39:19.269 scope[3118:303] 500
這裡使用點運算子賦值 編譯器有bug 顯示沒有方法setgglobalvar 拜託 本來就沒有setgglobalvar 只能使用方法賦值 使用靜態變數之後想要訪問 只能通過方法 這樣就符合了資料封裝原則
關於靜態變數
1、程式只分配一次記憶體 保留值
2、靜態全域性變數只在定義它的檔案中有效
3、靜態區域性變數只在定義它的方法或函式中有效
作用域,變數作用域,作用域鏈知識
第2章 變數作用域 第3章 作用域鏈 預覽 1.全域性作用域 整個script標籤下 或者是單獨的js檔案 外部js 2.區域性作用域也叫 函式作用域 在函式內部就是區域性作用域 這個 的名字 變數 只在函式內部起作用和效果 3.不同作用域下,定義相同變數名是不衝突的。如果是在同一作用域宣告2個相同...
變數的作用域
1 int i for i 0 i 10 i text console.writeline last text output in loop text 失敗,字串變數text是for迴圈的區域性變數,這段 不能編譯,因為在該迴圈外部呼叫的console.writeline 試圖使用該變數text,這...
變數的作用域
1.變數的作用域指明可訪問該變數的一段 宣告乙個變數的同時也就指明了變數的作用域。2.作用域的基本規則 1 引數宣告的作用域是宣告方法所在的方法體 2 區域性變數在方法或方法中的一塊 中宣告,它的作用域為它所在的 塊 整個方法或方法中的某塊 3 在帶標號的break和continue語句中,標號的作...