循环的声明范围

the declare scope of loop

谁能给我解释一下,为什么下面的代码有不同的输出?

void GenerateMatrix(int mat[][MaxSize],int ran[],const int rows,const int cols)  
{   
    int i,k=0;
    while (i<rows)
    {
        int j=0;
        while (j<cols)
        {
            mat[i][j]=ran[k];          
            j,k++;
        }
        i++;    
    }
}

正确的

void GenerateMatrix(int mat[][MaxSize],int ran[],const int rows,const int cols)
{
    int k=0;
    for (int i=0; i<rows;i++)
    {
        for (int j=0; j<cols;j++)
        {
        mat[i][j]=ran[k];
        k++;
        }
    }
}  

运行[]是在main()中声明的数组

int main()
{
    
    srand(time(NULL));
    int a[10];
    for (int i=0;i<10;i++)
    {
        a[i]={(rand() % 20-0+1)+1};
        cout<<a[i]<<endl;
    }
.
.
.
}

第一个总是输出st运行ge 运行dom号,而不是运行ge的运行dom号我在main里设置的a[] (). 第二个是正确的。 我在第一个函数中更改了 k 的声明范围,仍然是一样的。我只是想知道 部分结果?

您似乎在遵循“英语口语”方法来使用 ,,例如“对这个变量列表做一些事情”。在这篇文章中,初始化失败(它确实创建了一个与你的意思不同的列表;被 CherryDT 发现)和增量失败(由于误用逗号运算符;被包括我在内的两个评论者发现)可以被“阅读”。
我建议通过阅读“逗号运算符”并查看有关“,”其他用法的一些教程来改变它。
考虑 reducing/avoiding 完全使用,这对您的编码习惯来说太危险了。

在第一个函数中你有两个个错误:

  1. 声明

    int i,k=0;
    

    等同于

    int i;
    int k=0;
    

    这意味着 i 未初始化的 并且会有一个 不确定的 值。

    您还需要显式初始化它:

    int i = 0, k = 0;
    
  2. 第二个错误是语句:

    j,k++;
    

    这相当于

    j;
    k++;
    

    也就是说,它计算 the comma operator 的左侧(即 j),然后丢弃结果。然后它评估 returns 右侧的结果(即 k++)。

    您需要增加两个变量:

    j++;
    k++;
    

或者您可以使用 for 循环,它更紧凑,仍然具有可读性,并且更不容易犯第一个函数中的错误。