静的の3つの機能



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キーワードが必要であり、複数回宣言できます。

おすすめ

転載: blog.csdn.net/qq_34270874/article/details/109224688