C ++重新声明局部变量有什么影响?

时间:2012-11-13 00:52:24

标签: c++ variables declaration

我一直在使用下面的代码从文本文件中读取两个不同的矩阵。 代码重复声明(至少,我认为它重新声明)局部变量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();

2 个答案:

答案 0 :(得分:2)

是的,它重申了它们。但每个声明实际上都是一个不同的变量。就像你在两个不同的函数声明中调用x一样。

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

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

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

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

答案 1 :(得分:2)

每个变量都是在范围内创建的,而不是在函数或方法中创建的。

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

for循环的情况下,每个变量都被删除并在每个回合中重新创建。在实践中,编译器在内存中使用相同的安置,但变量是重新初始化的。