第7章機能
セクション5ローカル変数とグローバル変数
ローカル変数
関数内で定義された変数はローカル変数と呼ばれ、この関数のスコープ内でのみ有効です。つまり、
変数は関数内でのみ使用でき、これらの変数は関数外では使用できません
-
異なる関数が互いに干渉することなく同じ変数名を使用できます(メモリアドレスが同じでないことを確認してください)
-
仮パラメータもローカル変数であり、対応する関数でのみ有効です
#include <iostream>
void func1(int tmp) {
// 无法使用main函数中定义的m,n,k
// 这里能使用的变量是tmp,x,y
int x, y;//局部变量
int m, n;//和main函数中m,n不相同
return;
}
int main() {
// m.n,k这三个变量只在主函数中有效,虽然主函数调用了其他函数,但在其他函数中依旧无法使用主函数中的局部变量
int m, n;
int k = 4;
return 0;
}
- 特別な書き方
#include <iostream>
int main() {
int a = 2, b = 3;
{
// 用大括号写一段代码,大括号扩起来的叫复合语句,
// 在复合语句中定义的变量,这些变量只在本复合语句中有效
// 复合语句也叫程序块
int c;//有效范围只在符合语句内,一旦离开复合语句,变量c的内存就被系统释放了
c = a + b;
}
return 0;
}
2.グローバル変数
-
定義:関数の外部で定義された変数は、グローバル変数(外部変数)と呼ばれます
-
グローバル変数は、このドキュメントの他の関数で共有できます。
-
関数では、この関数のローカル変数と有効なグローバル変数の両方を使用できます
グローバル変数の利点と欠点
利点:
- 関数間のデータ通信チャネルが増加しました。関数がグローバル変数の値を変更すると、他の関数に影響を与える可能性があります。これは
、各関数の間に直接伝送チャネルがあることと同じです。パラメーターを渡すパラメーター
短所:
-
関数内のローカル変数とは異なり、グローバル変数はプログラムの実行サイクル全体でメモリを占有するため、必要な場合にのみグローバル変数を使用してください。関数内のローカル変数の特徴は、関数の実行後にこれらのローカル変数が占有することです。システムによってメモリが解放されます -
関数の実行はこれらの外部グローバル変数に依存するため、関数の汎用性が低下しました。関数が別のファイルに移行される場合
、これらの関連する外部変数も一緒に移行する必要があり、別のファイルに移行する場合同じ名前のグローバル変数もあり、競合があります -
グローバル量はプログラムの明快さと可読性を低下させ、プログラムを読む人は各外部変数の値を判断することが困難です(関数はグローバル変数の値を変更できます)
#include <iostream>
int v_g = 100;//全局变量,在函数外定义的变量
int f1(int a) {
v_g = 88;
return 1;
}
char c1_g, c2_g;
char f2(int x, int y) {
int i, j;
return 0;
}
int main() {
int v = 1;
f1(v);
printf("v_g in main : %d", v_g);
return 0;
}
解説
-
関数がその後に定義されたグローバル変数を参照する場合は、externというキーワードを使用して、外部グローバル変数の説明
を作成し、変数が関数の外部で定義されていることを示すことができます。したがって、グローバル変数はすべての関数の前に配置されます。グローバル変数の説明を省略 -
外部変数の説明と外部変数の説明を区別する:a)外部変数の定義は一度だけ定義でき、場所はすべての関数の外にあり、定義時にメモリが割り当てられ、定義時に値を初期化
でき、同じファイルに多くの外部変数の説明が存在する可能性があります。次に、外部変数はメモリが割り当てられていないことを示します
#include <iostream>
extern int v_g;// 外部变量说明(不分配内存), 表示在某个地方定义了c1,c2
int f1(int a) {
v_g = 88;
return 1;
}
int v_g = 100;//全局变量,在函数外定义的变量
int main() {
int v = 1;
f1(v);
printf("v_g in main : %d", v_g);
return 0;
}
- 同じソースファイルで、グローバル変数とローカル変数が同じ名前の場合、グローバル変数はローカル変数のスコープ内では機能しません
#include <iostream>
extern int v_g;// 外部变量说明(不分配内存), 表示在某个地方定义了c1,c2
int f1(int v_g) {
v_g = 88;//这里v_g是局部变量,要注意,仔细考虑一下,调用v_g并不会改变全局的v_g
return 1;
}
int v_g = 100;//全局变量,在函数外定义的变量
int main() {
int v = 1;
v_g = 3;
printf("v_g in main : %d\n", v_g);
{
int v_g;
v_g = 1;
printf("v_g in {} : %d\n", v_g);
}
f1(v);
printf("v_g in main after f1: %d", v_g);
return 0;
}