我的理解是,在 while 或 for 循环内创建的变量会在循环执行完毕后从内存中释放/删除(参见 reference 1 )。 但是为什么下面的代码显示变量正在使用 PREVIOUS 循环中的值?这是因为 stringstream 变量有一些特殊的能力吗?
以下是我的C++代码片段:
#include <iostream>
#include <sstream>
#include <string>
using namespace std;
int main(){
string str="1A2";
stringstream ss(str);
int intVar;
while(ss.good()){
char charVar;
ss >> intVar;
ss>> charVar;
cout<<"intVar="<<intVar << " charVar="<<charVar<<endl;
}
}
下面两行是实际输出:
intVar=1 charVar=A
intVar=2 charVar=A
为什么不是下面两行?
intVar=1 charVar=A
intVar=2 charVar=
最佳答案
首先,scope 和 life-time 是有区别的。
变量charVar
的生命周期 结束每次迭代,但变量仍在循环内的作用域 中。
您还需要知道未初始化的“本地”变量的值是不确定的 并且看起来是随机的。读取未初始化的变量(作为输出的一部分发生)导致 undefined behavior ,这就是您在这里遇到的情况。
实际发生的情况是用于变量 charVar
的内存不会改变,编译器在每次迭代时重用相同的位置。由于您不修改该内存,它只会保留存储在该内存中的最后一个值。
关于c++ - 为什么我的变量超出了它的范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52868516/