ホームページ > バックエンド開発 > C#.Net チュートリアル > 同じ名前の変数を異なる関数で使用できますか?

同じ名前の変数を異なる関数で使用できますか?

青灯夜游
リリース: 2022-12-30 11:13:00
オリジナル
24110 人が閲覧しました

######使える。 C言語の関数内に記述された変数はローカル変数であり、関数内でのみ動作し、他の関数には影響を与えません。異なる関数で同じ変数名を使用しても、それらが同じ変数であるとは限りません。

同じ名前の変数を異なる関数で使用できますか?このチュートリアルの動作環境: Windows7 システム、C99 バージョン、Dell G3 コンピューター。

同じ名前の変数は、異なる関数で使用できます。

#チュートリアルの推奨事項: 「c 言語チュートリアル ビデオ

関数内で定義された変数 (ローカル変数)

#関数内で定義された変数は、その有効範囲が関数内に限定され、関数外では使用できないため、このような変数をローカル変数(Local Variable)と呼びます。関数の仮パラメータもローカル変数であり、関数内でのみ使用できます。

int f1(int a){
    int b,c;  //a,b,c仅在函数f1()内有效
    return a+b+c;
}
int main(){
    int m,n;  //m,n仅在函数main()内有效
    return 0;
}
ログイン後にコピー
いくつかの注意:

1) main 関数で定義された変数はローカル変数でもあり、main 関数でのみ使用できます; 同時に、他の関数で定義された変数も使用できますmain関数では使用できません。 main 関数も関数であり、他の関数と同等のステータスを持ちます。

2) 仮パラメータ変数と関数本体で定義された変数はすべてローカル変数です。実パラメータから仮パラメータに値を転送するプロセスは、ローカル変数に値を割り当てるプロセスでもあります。

3) 異なる関数で同じ変数名を使用することができ、相互に干渉したり混乱を引き起こすことなく、異なるデータを表し、異なるメモリを割り当てます。

4) 変数はステートメント ブロック内でも定義でき、そのスコープは現在のステートメント ブロックに限定されます。

変数の名前付けについて

実行可能な C 言語コードには、最も単純な C 言語コードであっても、複数のスコープが含まれています。

int main(){
    return 0;
}
ログイン後にコピー
これは最も単純な実行可能な C 言語コードです。これには 2 つのスコープが含まれており、1 つは main() 関数内のローカル スコープであり、もう 1 つは main() 関数の外側のグローバル スコープです。

C 言語では、同じ名前の 2 つの変数を同じスコープ内に出現させることはできないと規定されており、そうしないと名前の競合が発生します。ただし、同じ名前の変数は異なるスコープ内に出現することが許可されており、それらのスコープは異なります。そして互いに衝突しません。この文には 2 つの意味があります:

同じ名前の変数は異なる関数内に出現でき、異なる関数は異なるローカル スコープを持ちます;

  • 変数同じ名前の関数は関数の内側と外側に出現できます。ローカル スコープは関数の内側にあり、グローバル スコープは関数の外側にあります。

  • 1) 異なる関数内の同じ名前の変数は完全に独立した 2 つの変数であり、相互に相関や影響はありません。

    #include <stdio.h>
    
    void func_a(){
        int n = 100;
        printf("func_a: n = %d\n", n);
        n = 86;
        printf("func_a: n = %d\n", n);
    }
    
    void func_b(){
        int n = 29;
        printf("func_b: n = %d\n", n);
        func_a(); //调用func_a()
        printf("func_b: n = %d\n", n);
    }
    
    int main(){
        func_b();
        return 0;
    }
    ログイン後にコピー
  • 実行結果:
func_b: n = 29
func_a: n = 100
func_a: n = 86
func_b: n = 29
ログイン後にコピー

func_a() と func_b() はどちらも内部的に変数 n を定義します。 func_b() では、 n の初期値は 29 です。 func_a() を呼び出した後、 n の値は依然として 29 です。これは、func_b() 内の n が func_a() 内の n に影響を与えないことを示しています。この 2 つの N はまったく異なる変数です。お互いをまったく「知りません」。名前が同じであるだけです。芸能人が服を合わせているようなものです。北京と雲南には李紅という名前の人がいます。それは単なる偶然です。

2) 関数内のローカル変数が関数外のグローバル変数と同じ名前を持つ場合、グローバル変数は現在の関数のローカル スコープで「シールド」され、何の効果もなくなります。 。つまり、関数内ではグローバル変数ではなくローカル変数が使用されます。

変数の使用は近接性の原則に従います。同じ名前の変数が現在のローカル スコープで見つかった場合、その変数はより大きなグローバル スコープでは検索されません。さらに、小さいスコープから大きいスコープまでの変数のみを検索できますが、小さいスコープの変数を使用してその逆はできません。

具体的な例を使用して説明します。

#include <stdio.h>

int n = 10;  //全局变量

void func1(){
    int n = 20;  //局部变量
    printf("func1 n: %d\n", n);
}

void func2(int n){
    printf("func2 n: %d\n", n);
}

void func3(){
    printf("func3 n: %d\n", n);
}

int main(){
    int n = 30;  //局部变量
    func1();
    func2(n);
    func3();
    printf("main n: %d\n", n);
   
    return 0;
}
ログイン後にコピー

実行結果:

func1 n: 20
func2 n: 30
func3 n: 10
main n: 30
ログイン後にコピー

コード内では同じ名前の複数の変数 n が定義されていますが、それらのスコープは異なります。 , そのため、名前の競合は発生しません。

以下は出力結果の分析です。

func1() の場合、出力結果は 20 です。明らかに、func1() の内部 n が外部 n の代わりに使用されます。

func2() を呼び出すと、main() の実パラメータ n が func2() の仮パラメータ n に渡され、このとき仮パラメータ n の値は 30 になります。仮パラメータ n もローカル変数なので、それが使用されます。

func3() は、グローバル変数を使用して 10 を出力します。func3() にはローカル変数 n がないため、コンパイラは関数の外、つまりグローバル スコープ内でのみ変数 n を探すことができます。

main() の printf() ステートメントは 30 を出力します。これは、main() の n が外部 n の代わりに使用されていることを示します。

プログラミング関連の知識について詳しくは、

プログラミング教育

をご覧ください。 !

以上が同じ名前の変数を異なる関数で使用できますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート