1

これらの線に沿って何かがあるとしましょう

int f(int n);

...。

do{
    int a = b;
    int b = f(a);
}

言うリスクはありますか

do{
    int b = f(b);
}

代わりに、aが他の場所で使用されていないと仮定しますか?前者を行うのがスタイル的に好ましいでしょうか?

4

2 に答える 2

3

ここで変数を「変更」するのではなく、名前の意味を変更するだけであることを理解することが重要です。

重要な概念は、宣言のポイントと呼ばれます。

あなたの例を見てみましょう:

int b = 42;
{ 
   int a = b; 
   int b = 23 * a;
   printf("%d\n", b);
}
printf("%d\n", b); 

また

int b = 42;
{ 
   int b = 23 * b;
   printf("%d\n", b);
}
printf("%d\n", b); 

名前 b は、コードのどこにいるかに応じて 2 つのオブジェクトを参照します。それらを b1 と b2 と呼びましょう。これは、ケース 1 では当然のことです。

int b1 = 42;
{ 
   int a = b1; 
   int b2 = 23 * a;
   printf("%d\n", b2);
} 
printf("%d\n", b1); 

C では宣言のポイントがinitializerの前にあるため、2 番目の例は異なる方法で解決されます。

int b1 = 42;
{ 
   int b2 = 23 * b2; 
   printf("%d\n", b2);
} 
printf("%d\n", b1); 

ここでは b1 と b2 の間にリンクがないことに注意してください。b2 を独自の (未定義の) 値で初期化しています。勤勉なコンパイラは、これについて次のように警告します。

x.c:7:13: warning: 'b' is used uninitialized in this function [-Wuninitialized]
于 2012-08-17T06:28:24.713 に答える
1

コンパイラが C コードを解析すると、シンボル テーブルに入力されます。このテーブルには、すべての異なるシンボルに関する情報が含まれます。シンボルとは、変数、関数などに付ける名前などの識別子を意味します。

ほとんどの C プログラムは、ネストされたスコープ、global -> function -> component_statements などから構成されます。通常、各スコープには独自のシンボル テーブルがあるため、コンパイラはシンボル テーブルのスタックを使用して、変数が検索されるときにすべてを追跡します。アップしますが、現在のシンボルテーブルで定義されていません。グローバルまたは通常は最後のテーブルにヒットするまで、スタックを上に移動して検索を開始します...しかし、現在のスコープで定義されるとすぐに、エントリが前の「シャドーイング」されます.

簡単なプログラムを示します。

#include <stdio.h> 
/* global accessable by most things ... */
int a = 5;
int main()
{ /* function scope */
    int a = 4; /* shadowing global */
    { /* nested scope within function scope */
        int b = a;
        int a = b; /* shadowing function  */
        printf("%i\n", a);
    }
    return 0;
 }

これを実行すると、どちらが期待されるかを取得できますが、コードをフォローしている人は、他のすべてのグローバル関数 main とは異なる4ことを心の奥底に留めておく必要があります...コードを維持しているプログラマーがこのことを認識していないか、自分で忘れていると、デバッグが非常に困難な微妙な実行時のバグが発生する可能性があります...aa

これを実行する場合は、次の点にも注意してください。

#include <stdio.h> 
/* global accessable by most things ... */
int a = 5;
int main()
{ /* function scope */
    int a = 4; /* shadowing global */
    { /* nested scope within function scope */            
        int a = a; /* shadowing function, but not actually accessing outer scope */
        printf("%i\n", a);
    }
    return 0;
 }

1606422610あなたは4を取得しませんが、変数がそれ自体に割り当てられているため、私のマシンではいくつかの大きなランダムintが発生し、cは変数を初期化しません。

于 2012-08-17T06:30:21.907 に答える