开关/案例中定义的变量是否保留其值?

彼德

我知道可以在switch语句中创建但不能初始化一个变量。但是我想知道在后续执行switch语句期间,是否已将创建的变量保留在内存中?

我假设命名变量CNT纽利创建每次执行switch语句。因此,在案例标签内的代码分配一个值之前cnt的值始终是未定义的!

#include <iostream>
using namespace std;

int main() {
    int iarr[6] = {0, 1, 1, 1, 0, 1};

    for (int i : iarr) {
        switch (i) {
            int cnt;
            case 0:
                // it is illegal to initalize value, therefore we assign an
                // inital value now
                cout << "Just assign 0 to the variable cnt.\n";
                cout << (cnt = 0) << "\n";
                break;
            case 1:
                cout << "Increment variable cnt.\n";
                cout << ++cnt << "\n";
                break;
        }
    }

    return 0;
}

但是至少在我的机器上和测试期间,在switch语句中定义的变量cnt保留了它的值。我认为这是一个误报,并且我的系统是否(运气不好)总是访问相同的内存区域?

输出(GCC 4.9):

$ g++ -o example example.cpp -std=gnu++11 -Wall -Wpedantic -fdiagnostics-color && ./example
Just assign 0 to the variable cnt.
0
Increment variable cnt.
1
Increment variable cnt.
2
Increment variable cnt.
3
Just assign 0 to the variable cnt.
0
Increment variable cnt.
1

谢谢

来自莫斯科的弗拉德

编译器不会显式初始化变量。因此,它具有一个值,该值存储在为变量分配的内存中。但是根据C ++标准,每次将控件传递到switch语句时都会创建变量。

实际上,没有什么可以阻止编译器在基于范围的复合语句中使用的其他代码块中使用相同的内存。

根据C ++标准

2具有自动存储持续时间(3.7.3)的变量在每次执行它们的声明语句时都会初始化。在该块中声明的具有自动存储持续时间的变量在从该块退出时被销毁(6.6)。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

开关案例中变量的范围

为什么结构中的变量不保留其值?

swift枚举在单个开关案例中获得具有相同参数的多个案例的关联值

在计算其初始值时是否定义了变量?

Matlab开关/案例中的空语句?

Java中的循环开关案例

是否可以从嵌套字典中删除顶级键并保留其值?

执行后如何使变量不保留其值?

如何在开关案例中为变量设置值,以及如何在PHP中调用外部变量

put_money是否按值或引用保留其参数?

在模块B中调用其值在模块A中定义的全局/公共变量

检查枚举值-替代30个案例的开关案例?

angularjs在一个开关案例中包含两个值

不能在perl中定义其值不能在子例程中更改的变量?

检查R数据帧中是否存在变量:是否保留值,如果未设置为NA

我似乎无法让jquery变量保留其值

从JSON属性中删除,但保留其值

在VB.NET中,变量在页面事务之间保留其值是否正常?

如何在PHP的另一个开关案例块中检索分配给一个开关案例块中变量的值?

在PHP中,如何使变量在重新加载后保留其值?

在C ++中是否可以在开关范围之外声明变量?

保留SAS中组中变量的值

路径变量在覆盖后如何保留其旧值

从开关案例中在Linq中添加条件值

重用开关/案例中的变量存储值

开关案例Java之外的变量

Python:为什么类方法中的此本地列表变量保留其值?

std::string 变量不保留其值

变量不保留其值