我一直在使用下面的代码从文本文件中读取两个不同的矩阵。
代码重复声明(至少,我认为它重新声明)局部变量stringvalues
和iss
。我刚才意识到变量已经重新声明 - 我当然不打算重新声明它们。
问题:反复重新声明这些变量有什么影响?
仅供参考:我正在使用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();
答案 0 :(得分:2)
是的,它重申了它们。但每个声明实际上都是一个不同的变量。就像你在两个不同的函数声明中调用x
一样。
该变量显示在块的开头声明。变量在声明结束的块之后变为“超出范围”(即它被销毁并且不再存在)。
实际上,对于for
循环的每次迭代,该变量都会被销毁并重新创建一次。每次它具有相同的名称,但在概念上是一个完全不同的变量(即使它在内存中占据相同的位置)。
此外,如果您尝试在两个stringvalues
循环之间使用变量for
,编译器会给您一个错误,因为该变量不存在。
因此,即使这两个变量声明声明了具有相同名称的变量,这些变量实际上也是不同的变量。您可以重命名第二个块中的一个,在名称的末尾加上1
,效果将完全相同。
答案 1 :(得分:2)
每个变量都是在范围内创建的,而不是在函数或方法中创建的。
在您的示例中,您有两个不同的范围,因此有两个不同的变量。
在for
循环之后,将删除for中声明的所有变量(包括示例中的i
变量)。循环后你不能使用它。
在for
循环的情况下,每个变量都被删除并在每个回合中重新创建。在实践中,编译器在内存中使用相同的安置,但变量是重新初始化的。