【问题标题】:Can someone help me understand the execution of this C program? (Beginner)有人可以帮我理解这个 C 程序的执行吗? (初学者)
【发布时间】:2020-05-13 20:26:24
【问题描述】:
 #include <stdio.h>

 main() 
 {
    int a[2][5], i,j; //2d array declaration

    for(i=0;i<=1;i++) //first loop for 1st dimension
    {
        for(j=0;j<=4;j++) //nested loop for 2nd dimention
        {
            printf("Value for a[%d][%d] is :  ", i,j);
            scanf("%d", &a[i][j]); //asks for value
        }
    } 
 }

在这个程序中,当循环执行时,在第一次运行时,i=0,并且在其中 j=0,1,2,3,4。 完成后,到了 i=1 的第二维,为什么在条件已经为假(j

所有这些常量值都保存在哪里?再次运行嵌套循环时是否会重新启动 j 的值?

【问题讨论】:

  • 除此之外:您正在使用幻数作为数组维度和循环迭代限制,但由于引入了引用相同限制的 不同 幻数,它们会变得更糟。因此,鉴于您对数组维度进行了硬编码,我将使用 same 值,方法是将循环 for(i=0; i&lt;=1; i++) 改写为 for(i=0; i&lt;2; i++) 同上另一个。稍后,当您将它们替换为变量或定义的名称时,您只需查找一个相关值。遵循代码也更容易。

标签: c arrays loops


【解决方案1】:

for 循环具有 for (A;B;C) 形式的三个组件(表达式):

  • A - 预迭代,开始运行一次
  • B - 循环条件,每次迭代之前测试,包括第一次
  • C - 迭代后,在每次迭代之后执行

您要求在每次循环开始时初始化j=0,然后测试j &lt;= 4,这将是正确的。当循环重复时,它会执行j++,然后再次测试。

值得注意的是,这些都是可选的,for (;;) 是有效的,但是除非你break 它是一个无限循环。

【讨论】:

  • 那么当 i=1 的循环第二次运行时,j 变为 0?
  • 如您所说for (j=0;..) 所要求的,是的。在调试器中单步执行此代码以查看其运行方式非常具有教育意义。
【解决方案2】:

稍作改进:

int main(void) //added int and void to main
 {
    int a[2][5], i,j; //2d array declaration

    for(i=0;i<2;i++) //first loop for 1st dimension
    {
        for(j=0;j<5;j++) //nested loop for 2nd dimention
        {
            scanf("%d", &a[i][j]); //asks for value [note, before printf]
            printf("Value for a[%d][%d] is %d\n:  ", i,j, a[i][j]);
        }
    }
    return 0;//int main(void) requires a return statement
             //Note also, 'main()' is really not a proper signature for              
             //the main function 
 }

此代码打算通过使用scanf 提示的输入值为二维数组的每个成员分配值,但由于某些语法和逻辑错误,原始代码无法按预期工作。为了提供帮助,嵌套 for 循环中两行的顺序已被切换,以防止数组在初始化之前被访问。

嵌套的for 循环索引已在此版本中进行了修改,以使用与声明中数组大小相同的限制值:

int a[2][5];
for(i=0;i<2;i++)
    for(i=0;j<5;i++)

scanf() 是用于用户输入的方法。每个调用都会提示输入一个值,该值被放入由ij 指示的相应行列索引中,并写入stdout。请注意,原始代码中的实际值并未打印出来,而是在此稍作修改的版本中。

【讨论】:

    【解决方案3】:

    每次运行嵌套循环时 j 的值都会被初始化为 0,因为你将 for 语句的初始化表达式设置为“j=0”

    每次执行外循环时都会运行该表达式

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-01-02
      • 2020-04-05
      • 1970-01-01
      • 1970-01-01
      • 2023-03-06
      • 2020-03-25
      • 2021-12-24
      • 1970-01-01
      相关资源
      最近更新 更多