为什么我的变量存在于其范围之外
Why does my variable live outside its scope
我的理解是,在循环完成执行后,在一段时间内或循环内创建的变量从内存中释放/删除(参见参考文献1(。 但是为什么下面的代码显示变量正在使用 PREVIOUS 循环中的值?这是因为字符串流变量具有某种特殊功能吗?
以下是我的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;
}
}
以下 2 行是实际输出:
intVar=1 charVar=A
intVar=2 charVar=A
为什么不是以下2行?
intVar=1 charVar=A
intVar=2 charVar=
首先,范围和生命周期之间存在差异。
变量的生命周期charVar
每次迭代都结束,但变量仍在循环内的范围内。
您还需要知道未初始化的"局部"变量的值是不确定的,并且似乎是随机的。读取未初始化的变量(作为输出的一部分发生(会导致未定义的行为,这就是您在这里遇到的。
实际上发生的事情是用于变量charVar
的内存不会改变,编译器每次迭代都重复使用相同的位置。而且由于您不修改该内存,因此它将仅保留存储在该内存中的最后一个值。
这是因为循环在打印值之前尚未结束,并且由于在 charvar 中的最后一次迭代期间没有要输入的值,因此它将保留其最后一次的值。 变量的作用域仅在循环中,直到循环的最后一次迭代才会被销毁。 希望我说得有道理
相关文章:
- 如何访问超出其块范围的对象?
- 使用模板参数重载C++方法:如何使其适用于模板的子类?
- 为什么我的变量存在于其范围之外
- C++未知长度字符串的数组,其行为类似于 Python 字符串列表
- 有没有办法在另一个函数中加入线程?(即超出其自身范围)
- 立即传递其成员时的右值范围
- 在其范围之外使用局部变量
- 分离线程然后让它超出范围(并使其仍在运行)是否安全?
- 如果 LTO 中的代码依赖于其构造的副作用,是否允许 LTO 删除未使用的全局对象?
- 以编程方式推断出枚举的大小,独立于其元素的价值
- 如何使用C++相对于其原始值更新 SQLite 行
- OOP设计:一个对象依赖于其所有依赖项的存在
- 我可以创建一个链接另一个库但不依赖于其include的c++库吗
- 类模板,独立于其参数的排列
- 相对于其数据在特定方向上移动的有效方法是什么
- 如果函数类型仅依赖于其自己的模板参数,则取决于函数类型
- 加载到内存的文件的大小远大于其磁盘大小?!!任何压缩方式
- 引用相对于其目标的生存期
- 使用"std::conditional_t"定义依赖于其模板参数的类"typedef"
- 类似于变换的升压范围适配器,其可以访问相邻元件