循环的声明范围
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 完全使用,这对您的编码习惯来说太危险了。
在第一个函数中你有两个个错误:
声明
int i,k=0;
等同于
int i;
int k=0;
这意味着 i
是 未初始化的 并且会有一个 不确定的 值。
您还需要显式初始化它:
int i = 0, k = 0;
第二个错误是语句:
j,k++;
这相当于
j;
k++;
也就是说,它计算 the comma operator 的左侧(即 j
),然后丢弃结果。然后它评估 returns 右侧的结果(即 k++
)。
您需要增加两个变量:
j++;
k++;
或者您可以使用 for
循环,它更紧凑,仍然具有可读性,并且更不容易犯第一个函数中的错误。
谁能给我解释一下,为什么下面的代码有不同的输出?
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 完全使用,这对您的编码习惯来说太危险了。
在第一个函数中你有两个个错误:
声明
int i,k=0;
等同于
int i; int k=0;
这意味着
i
是 未初始化的 并且会有一个 不确定的 值。您还需要显式初始化它:
int i = 0, k = 0;
第二个错误是语句:
j,k++;
这相当于
j; k++;
也就是说,它计算 the comma operator 的左侧(即
j
),然后丢弃结果。然后它评估 returns 右侧的结果(即k++
)。您需要增加两个变量:
j++; k++;
或者您可以使用 for
循环,它更紧凑,仍然具有可读性,并且更不容易犯第一个函数中的错误。