2

以下のコードを使用して、テキストファイルから2つの異なるマトリックスを読み取りました。コードは、ローカル変数とを繰り返し再宣言します(少なくとも、再宣言すると思います) 。変数が再宣言されていることに気づきました。確かに、変数を再宣言するつもりはありませんでした。stringvaluesiss

質問:これらの変数を繰り返し再宣言することの効果は何ですか?

参考:GCC4.4.3でコンパイルしています。

fstream PW3_in("./input/PW.txt", ios::in);
for(int i=0; i<900; i++)
{
    PW3_in.getline(line, 450);

    string stringvalues;
    stringvalues = line;
    istringstream iss (stringvalues,istringstream::in);

    iss >> word1 >> word2 >> word3 >> word4 >> word5 >> word6 >> word7 >> word8 >> word9;

    num1 = strtod(word1, NULL);
    num2 = strtod(word2, NULL);
    num3 = strtod(word3, NULL);
    num4 = strtod(word4, NULL);
    num5 = strtod(word5, NULL);
    num6 = strtod(word6, NULL);
    num7 = strtod(word7, NULL);
    num8 = strtod(word8, NULL);
    num9 = strtod(word9, NULL);

    PW3[0+i*9]=num1;
    PW3[1+i*9]=num2;
    PW3[2+i*9]=num3;
    PW3[3+i*9]=num4;
    PW3[4+i*9]=num5;
    PW3[5+i*9]=num6;
    PW3[6+i*9]=num7;
    PW3[7+i*9]=num8;
    PW3[8+i*9]=num9;

}
PW3_in.close();


fstream PP3_in("./input/PP.txt", ios::in);
for(int i=0; i<900; i++)
{
    PP3_in.getline(line, 450);

    string stringvalues;
    stringvalues = line;
    istringstream iss (stringvalues,istringstream::in);

    iss >> word1 >> word2 >> word3 >> word4 >> word5 >> word6 >> word7 >> word8 >> word9;

    num1 = strtod(word1, NULL);
    num2 = strtod(word2, NULL);
    num3 = strtod(word3, NULL);
    num4 = strtod(word4, NULL);
    num5 = strtod(word5, NULL);
    num6 = strtod(word6, NULL);
    num7 = strtod(word7, NULL);
    num8 = strtod(word8, NULL);
    num9 = strtod(word9, NULL);

    PP3[0+i*9]=num1;
    PP3[1+i*9]=num2;
    PP3[2+i*9]=num3;
    PP3[3+i*9]=num4;
    PP3[4+i*9]=num5;
    PP3[5+i*9]=num6;
    PP3[6+i*9]=num7;
    PP3[7+i*9]=num8;
    PP3[8+i*9]=num9;

}
PP3_in.close();
4

2 に答える 2

2

はい、再宣言します。しかし、各宣言は実際には異なる変数です。x2 つの異なる関数宣言で何かを呼び出した場合と同様です。

その変数は、ブロックの先頭で宣言されているように見えます。変数が宣言されたブロックが終了した後、変数は「範囲外」になります (つまり、破棄されて存在しなくなります)。

for実際、その変数は、ループの反復ごとに一度破棄され、再作成されます。毎回同じ名前ですが、概念的には完全に異なる変数です (メモリ内の同じ場所を占有していても)。

stringvaluesまた、 2 つのループ間で変数を使用しようとすると、for変数がそこに存在しないため、コンパイラはエラーを返します。

したがって、これら 2 つの変数宣言で同じ名前の変数が宣言されていても、それらの変数は実際には異なる変数です。2 番目のブロックの名前を変更して1、名前の末尾に を付けるだけで、効果はまったく同じになります。

于 2012-11-13T00:55:12.117 に答える
2

各変数は、関数やメソッドではなく、スコープで作成されます。

あなたの例では、2 つの differents スコープと 2 つの differents 変数があります。forループの後、 for で宣言されたすべての変数 (i例の変数を含む) が削除されます。ループ後は使用できません。

ループの場合for、各変数は削除され、ターンごとに再作成されます。実際には、コンパイラはメモリ内で同じ配置を使用しますが、変数は再初期化されます。

于 2012-11-13T00:57:40.877 に答える