2

我一直在使用下面的代码从文本文件中读取两个不同的矩阵。该代码反复重新声明(至少,我认为它重新声明了)局部变量stringvaluesiss. 我刚刚意识到变量被重新声明了——我当然不打算重新声明它们。

问题:反复重新声明这些变量有什么影响?

仅供参考:我正在使用 GCC 4.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

是的,它重新声明了它们。但是每个声明实际上是一个不同的变量。就像您x在两个不同的函数声明中调用某些东西一样。

该变量显示在块的开头声明。在声明它的块结束后,一个变量会“超出范围”(即它被销毁并且不再存在)。

事实上,对于for循环的每次迭代,该变量都会被销毁并重新创建一次。每次它都具有相同的名称,但在概念上是一个完全不同的变量(即使它在内存中占据相同的位置)。

此外,如果您尝试stringvalues在两个for循环之间使用变量,编译器会给您一个错误,因为该变量在那里不存在。

因此,即使这两个变量声明声明了具有相同名称的变量,这些变量实际上是不同的变量。您可以将第二个块中的名称重命名1为在名称末尾添加一个,效果将完全相同。

于 2012-11-13T00:55:12.117 回答
2

每个变量都是在作用域中创建的,而不是在函数或方法中。

在您的示例中,您有两个不同的范围,因此有两个不同的变量。for循环后,在 for 中声明的所有变量(包括i您的示例中的变量)都将被删除。你不能在循环之后使用它。

for循环的情况下,每个变量都会被删除并在每轮重新创建。实际上,编译器在内存中使用相同的位置,但变量被重新初始化。

于 2012-11-13T00:57:40.877 回答