为什么不启动迭代器子循环,使其在一个父循环完成后停止呢?

时间:2019-06-11 06:33:45

标签: c++

如果我不使用零将迭代器 i j 初始化,则会发生这种情况。编译器确实通过零来初始化它们,但是不知何故子循环并没有进行迭代。有什么解释吗?

我已经找到了解决方案,但是我在问这背后的原因是什么?

void sortById(int *arr,  int size){
    for (int i; i<size; i++){
        cout << "i = " << i << "\n" ;
        for (int j; j<size; j++){
            cout << "j = " << j << "\n";
        }
     }
}

int main(){
int Ids[5] = {15,3,1,10,25};
int size = 5;

sortById(Ids, size);
}


//Output:
i = 0 
j = 0 
j = 1 
j = 2 
j = 3 
j = 4 
i = 1 
i = 2 
i = 3 
i = 4

2 个答案:

答案 0 :(得分:0)

这是因为未初始化的变量具有在其上创建的内存段的值,通常这是垃圾。因此,您的循环最好从0x2342FF开始

答案 1 :(得分:0)

简单来说, 不,它不会将其初始化为零。

如果以前的程序未清除内存,而您尝试在函数内部初始化变量,则与该变量关联的内存将在堆栈中分配。而且它不初始化值,它可以保存任何值(由先前的程序使用,也可以为零)。

此值称为“垃圾值”。

详细说明:

每个函数在由编译器编译时,然后分为两部分:

  1. 代码部分。
  2. 数据部分。

有关变量应存储在何处的信息可以在存储类说明符中找到。在storage class specifier

上查看更多信息

并且默认情况下,存储类为“自动”,这意味着变量存储在函数的堆栈部分中。在堆栈中初始化事物时,与该变量关联的值是未知的或“垃圾值”,这意味着它可能为零,也可能不为零。无法保证任何一个值都可以被赋予。