1つは、ローカル変数を変更する-静的ローカル変数
staticがローカル変数を変更すると、変数のライフサイクルが変更されるため、静的ローカル変数はスコープ外になり、引き続き存在します。ライフサイクルはプログラムが終了するまで終了しませんが、スコープは変更されず、ローカルスコープのままになります。関数を定義する場合または、ステートメントブロックが終了すると、スコープが終了します。
コード1:静的変更なしのローカル変数
#include <stdio.h>
void test(){
int i = 0;
i++;
printf("%d ", i);
}
int main()
{
int i = 0;
for (i = 0; i < 10; i++){
test();
}
system("pause");
return 0;
}
結果:
分析:
変数iがスコープ外になった後、ライフサイクルとスコープは無効になります。forループが実行されるたびに、再定義および初期化されます。
コード2:静的はローカル変数を変更します
#include <stdio.h>
void test(){
static int i = 0;
i++;
printf("%d ", i);
}
int main()
{
int i = 0;
for (i = 0; i < 10; i++){
test();
}
system("pause");
return 0;
}
結果:
分析:
変数iは、最初に呼び出されたときに1回だけ作成および初期化され、次にi ++が実行され、毎回1つずつ追加されます。
2つ目は、グローバル変数を変更する-静的グローバル変数
staticがグローバル変数を変更する場合、このグローバル変数はこのソースファイルでのみ使用でき、他のソースファイルでは使用できません。
コード1:静的変更なしのグローバル変数
tc
//t.c
int g = 2020;
test.c
//test.c
#include <stdio.h>
extern int g;
int main()
{
printf("%d\n",g);
system("pause");
return 0;
}
結果:
分析:
結果は2020年です。
コード2:静的に変更されたグローバル変数
tc
//t.c
static int g = 2020;
test.c
//test.c
#include <stdio.h>
extern int g;
int main()
{
printf("%d\n",g);
system("pause");
return 0;
}
結果:
分析:
生成されたエラー、未解決の外部シンボル_g、未解決の外部コマンド、およびstaticによって変更されたグローバル変数は、このソースファイルでのみ使用でき、他のソースファイルでは使用できません。
3つの変更された機能-静的機能
静的に変更された関数。この関数は、このファイル内でのみ呼び出またはアクセスされ、ファイル間でアクセスすることはできません。同じ名前の関数は、競合することなく他のファイルで定義できます。
コード1:静的変更なしの関数
add.c
//add.c
int MyAdd(int x, int y){
return x + y;
}
sc
//s.c
#include <stdio.h>
extern int MyAdd(int x, int y);
int main()
{
printf("%d\n", MyAdd(1, 1));
system("pause");
return 0;
}
結果:
分析:
出力結果2。
コード2:静的に変更された関数
add.c
//add.c
static int MyAdd(int x, int y){
return x + y;
}
sc
//s.c
#include <stdio.h>
extern int MyAdd(int x, int y);
int main()
{
printf("%d\n", MyAdd(1, 1));
system("pause");
return 0;
}
結果:
分析:
関数_mainで参照されている未解決の外部シンボル_MyAddは、解決不可能な外部コマンドです。staticによって変更された関数は、このファイル内でのみ呼び出しまたはアクセスでき、ファイル間でアクセスすることはできません。
コード3:静的に変更された関数と同じ名前の関数
my.c
//my.c
int MyAdd(int a, int b){
return a-b;
}
#include <stdio.h>
int main()
{
printf("%d\n", MyAdd(1, 1));
system("pause");
return 0;
}
結果;
分析:
静的に変更された関数の場合、同じ名前の関数を他のファイルで競合することなく定義できます。
4つ、要約と注意点
1. staticがローカル変数を変更すると、変数のライフサイクルが変更されるため、静的ローカル変数はスコープ外に存在し、プログラムが終了するとライフサイクルは終了し、スコープはローカルスコープのままになります。
2. staticがグローバル変数を変更する場合、このグローバル変数はこのソースファイルでのみ使用でき、他のソースファイルでは使用できません。
3. staticが関数を変更する場合、関数はこのファイル内でのみ呼び出されるかアクセスされ、ファイル間でアクセスすることはできません。同じ名前の関数は、競合することなく他のファイルで定義できます。
4.グローバル変数および関数を外部で宣言する場合、externキーワードが必要であり、複数回宣言できます。