c++ - 为什么我的变量超出了它的范围

标签 c++ scope

我的理解是,在 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=

最佳答案

首先,scopelife-time 是有区别的。

变量charVar生命周期 结束每次迭代,但变量仍在循环内的作用域 中。

您还需要知道未初始化的“本地”变量的值是不确定的 并且看起来是随机的。读取未初始化的变量(作为输出的一部分发生)导致 undefined behavior ,这就是您在这里遇到的情况。

实际发生的情况是用于变量 charVar 的内存不会改变,编译器在每次迭代时重用相同的位置。由于您不修改该内存,它只会保留存储在该内存中的最后一个值。

关于c++ - 为什么我的变量超出了它的范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52868516/

相关文章:

c - 在同一个函数中,通过间接访问访问不在范围内的局部变量是否是 UB?

node.js - IntelliJ NodeJS 调试回调范围引用错误

c++ - 如何声明接受转发引用并返回引用或拷贝的函数模板

c++ - dynamic_cast以意外的方式成功

c++ - 解析一个字符串得到第n个字段

c++ - 将 tm 结构转换为 boost::local_time::local_date_time

javascript - 更新javascript中事件函数中的全局变量

c++ - 错误 : ‘app’ was not declared in this scope

javascript - Angular js - 通过http获取参数值并将它们提供给 View

variables - 如何在 Elixir 中更新函数内的 bool 变量