【问题标题】:How do I write a for loop in C [duplicate]如何在 C 中编写 for 循环 [重复]
【发布时间】:2017-11-17 11:03:40
【问题描述】:

为什么下面的代码循环了 5000 次而不是我预期的 5 次?

int height = 5;

for (int height; height > 0; height -= 1){
    printf('Something')  }
}

【问题讨论】:

  • 完全删除循环内声明:for (; height > 0; height--) 将起作用。
  • @TomKarzes;在某些情况下,您可能需要在外部范围内保留 height 的值。在这种情况下,您必须使用另一个变量进行循环。
  • 回答:你不知道。了解for 的基本语法和子句会清楚这一点。此外,写成--height 而不是height -= 1 更符合习惯和可读性。 [插入强制性的 OT 咆哮,除非你需要,否则不要使用后增量/减量]
  • 像这样的一些问题在一分钟内有 10 个反对票。其他人有(目前)三个赞成票的答案......

标签: c loops for-loop


【解决方案1】:

但是当我运行它时,它不会遍历循环 5 次,而是像 5000 次。

这是因为height 在for 循环中声明shadows 在外部声明。所以你是 有效地使用未初始化的height,即potentially undefined behaviour。

您可以省略声明以使用先前声明的值:

int height = 5;

for (; height > 0; height -= 1) {
    printf("Something");
}

如果不想更改height,可以使用临时的:

int height = 5;

for (int x = height; x > 0; x -= 1) {
    printf("Something");
}

这将使height 保持不变。

还要注意,单引号中的值是多字节字符,而不是字符串。所以你不能将'Something' 传递给printf。

【讨论】:

  • 很酷的人 :)
  • 不客气!
【解决方案2】:

为什么必须在 C 的 for 循环中重新定义变量

这可能是因为您想在循环后保留/使用变量的值。

如果发生

int height = 5;

for (int h = height; h > 0; h--){
    printf('Something')  }
}

height 的值为 5。而在

的情况下
int height = 5;

for (height; height > 0; height--){
    printf('Something')  }
}

height 在for 循环之后的值为零。

【讨论】:

  • 当然,第一个for 子句中的height 没有任何作用,并且可能使您的代码的读者认为您打算做其他事情。 IMO 最好省略它。
  • @underscore_d;除此之外,早期代码 sn-ps 中几乎没有其他错误。经过多次编辑,我已经修复了所有问题:)
  • 哦,我的意思是for (height; 现在在最后的摘录中——不知道我为什么说“第一”——但我明白你对其他人的意思。 :P
  • @TonyTannous;我猜for 循环中有一个检查,确保height 不能低于0。
【解决方案3】:

这不是最初的重新定义。

基本上,因为 C 有作用域,重新定义变量会隐藏外部作用域的所有变量:

for (int i=0; i<10; i++)
    for (int i=0; i<10; i++) {
        // Code that'll be looped 100 times
        // Code here can't access the outer `i`
    }

如果你不重新定义它

for (int i=0; i<10; i++){
    for (; i<10; i++)
        // Code that'll be looped 10 times
    // Code that'll be run only once
}

如果你定义一个变量而不初始化它:

for (int h; h>0; h--)
    // Code that'll be looped for unknown times

在这段代码中,h 的初始值为indeterminate。它可能是 5000 或零,甚至超过 2,000,000,000!总是在使用变量之前为其赋值。

【讨论】:

  • @user694733 我的错。编辑时我头晕。
【解决方案4】:

您必须在循环定义中使用用户输入重新定义 height 变量。

你可以这样做:

int user_input;
scanf("%d", &user_input);

for (int height = user_input; height > 0; height -= 1){
    printf("height = %d\n", height);  
}

如果用户输入“5”,此代码将打印:

height = 5
height = 4
height = 3
height = 2
height = 1

【讨论】:

  • 哎呀,当然。不过,我认为他们已经知道如何做到这一点,这不是他们要问的主要问题。您并没有真正回答关于重新定义或重用变量的问题,一旦用户提供了它。说“你必须重新定义”是不正确的,正如其他人所表明的那样。
  • “我想从用户那里获取变量作为输入。” - 问题的作者说关于用户输入。我刚刚写了一个用户输入的例子。
  • “我想他们已经知道该怎么做” - 我在没有其他答案时写下了我的答案。此外,我对其进行了编辑,并更改了答案列表中的位置。我是新来的,对不起。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-09-08
  • 2022-01-27
  • 1970-01-01
  • 2017-03-30
  • 2019-07-16
  • 2017-09-11
  • 2019-03-11
相关资源
最近更新 更多