为什么我的变量不在其范围内

时间:2018-10-18 06:55:08

标签: c++ scope

我的理解是,在执行完循环后,在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=

2 个答案:

答案 0 :(得分:7)

首先,作用域生命周期之间存在差异。

变量charVar生存期结束每次迭代,但是该变量仍位于循环内的 scope 中。

此外,您还需要知道未初始化的“局部”变量的值是不确定的,而且看似随机。读取未初始化的变量(在输出中发生)会导致undefined behavior,这就是您在这里遇到的情况。

实际上发生的是,用于变量charVar的内存没有变化,编译器重用每次迭代都在相同的位置。而且由于您不修改该内存,因此只会保留该内存中存储的最后一个值。

答案 1 :(得分:0)

这是因为循环在值被打印之前尚未结束,并且由于在charvar的最后一次迭代期间没有要输入的值,因此它将保留倒数第二次的值。 变量的作用域仅在循环中,直到循环的最后一次迭代时它才被销毁。 希望我有道理