我的理解是,在执行完循环后,在while内或for循环中创建的变量会从内存中处置/删除。 但是,以下代码为什么显示变量正在使用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=
答案 0 :(得分:7)
首先,作用域和生命周期之间存在差异。
变量charVar
的生存期结束每次迭代,但是该变量仍位于循环内的 scope 中。
此外,您还需要知道未初始化的“局部”变量的值是不确定的,而且看似随机。读取未初始化的变量(在输出中发生)会导致undefined behavior,这就是您在这里遇到的情况。
实际上发生的是,用于变量charVar
的内存没有变化,编译器重用每次迭代都在相同的位置。而且由于您不修改该内存,因此只会保留该内存中存储的最后一个值。
答案 1 :(得分:0)
这是因为循环在值被打印之前尚未结束,并且由于在charvar的最后一次迭代期间没有要输入的值,因此它将保留倒数第二次的值。 变量的作用域仅在循环中,直到循环的最后一次迭代时它才被销毁。 希望我有道理