【问题标题】:the declare scope of loop循环的声明范围
【发布时间】:2021-05-25 06:31:25
【问题描述】:

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

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++;
        }
    }
}  

ran[] 是一个在 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;
    }
.
.
.
}

第一个总是输出奇怪的随机数,不在我在 main() 中为 a[] 设置的随机数范围内。 第二个是正确的。 我在第一个函数中更改了 k 的声明范围,仍然相同。我只是想知道女巫的部分结果是什么?

【问题讨论】:

  • 你打算j,k++;做什么?您是否进行了调试以观察变量是否按预期变化?
  • int i, k = 0 等价于int i; int k = 0,因此i 在您访问它时未初始化,从而触发未定义的行为。你的意思可能是int i = 0, k = 0
  • 还有j,k++等价于k++(假设j的评估没有副作用),不是一个很有用的语句。
  • 谢谢,我一直认为我可以同时声明两个整数...,如果我想同时增加两个计数器变量,有没有更好的方法来代替j,k++
  • 错误,j++; k++;?

标签: c++ scope


【解决方案1】:

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

【讨论】:

  • 供参考,称为“逗号运算符”。
  • @CherryDT 并非在所有有问题的情况下。另外,我认为以这种方式提及它对 OP 没有帮助。但为了完整起见,我会添加它。谢谢。
  • 我的意思是很难用谷歌搜索文字逗号。但你是对的,在初始化问题的情况下,它与那个操作符无关。
  • @CherryDT True.
  • 无关:是的,你是对的。感谢第一个指出这一点的人。
【解决方案2】:

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

  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),然后丢弃结果。然后它评估并返回右侧的结果(即k++)。

    您需要增加两个变量:

    j++;
    k++;
    

或者您可以使用for 循环,它更紧凑、可读性更强,并且更难犯第一个函数中的此类错误。

【讨论】:

    猜你喜欢
    • 2015-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-22
    • 1970-01-01
    • 1970-01-01
    • 2011-02-13
    • 1970-01-01
    相关资源
    最近更新 更多