当我在C中写“I==0”时,For循环工作,但当“I=0”时不工作?

当我在C中写“I==0”时,For循环工作,但当“I=0”时不工作?,c,for-loop,C,For Loop,我试图写一个程序,列出一个给定数字的因子。当我写这篇文章时,它起作用了: int main () { int num, i; printf("\nEnter a number: "); scanf("%d", &num); for(i == 0; i <= num; ++i) { if (num % i == 0) { printf("\n\t%d", i); } } } 但当for循环为 for

我试图写一个程序,列出一个给定数字的因子。当我写这篇文章时,它起作用了:

int main () {

  int num, i;

  printf("\nEnter a number: ");
  scanf("%d", &num);

    for(i == 0; i <= num; ++i) {
        if (num % i == 0) {
        printf("\n\t%d", i);
        }
    }
 }
但当for循环为

for(i = 0; i <= num; ++i)

我很困惑,因为我认为这是for循环的格式。有人能指出我的错误吗?

在这种情况下,你应该以i=1开始循环,就像在fori=1中一样;i在C中,有两个看起来有些相似的单独运算符-一个赋值语句使用一个等号,另一个相等比较语句使用两个等号。这两者不应该混淆,尽管它们经常混淆

i==0是与零的比较,而不是零的赋值。不过,它是一个有效的表达式,因此编译器不会抱怨:for循环允许任何类型的表达式出现在它的头中,只要表达式的格式正确


但是,您的代码将无法工作,因为它具有未定义的行为:在整个循环中,我始终未初始化,使您的程序无效。

i==0是一个没有副作用的表达式,因此编写fori==0;for循环的第一部分是定义迭代器i的起始值。 由于您没有初始化它,它可能有一个未定义的值,或者有时只是垃圾值

因此,当您使用i==0时,您并没有将值赋给i,只是检查它是否等于0。 未定义时i的值通常是非常随机的,但它可以具有整数max值,因此将其递增一次实际上会使其变为initger最小值

所以实际上正确的答案是:
fori=0;ii==0很可能为假,具体取决于i中的垃圾。。。。也就是0。但是0根本没有分配给i。我也很困惑。在该上下文中,i==0是一个no-op,因此我从它最初包含的垃圾值开始。当然,如果你能描述你所看到的任何暗示错误的症状,这将非常有帮助;iSo我使用的是code::blocks,当我编译程序时,它不会给我任何错误。然后,当我运行它时,它打印并输入一个数字:它应该这样做,但当我输入一个数字时,我被告知'factors.c'已经停止工作。并被告知关闭程序或搜索解决方案。代码崩溃的原因是您试图除以0。将其更改为i=1,它应该可以工作“…所以写fori==0;i@PascalCuoq就足够了,但是如果我之前没有初始化过,两个版本都会调用未定义的行为,所以在某种意义上它们仍然是一样的。也就是说,在任何情况下,它们中的一个会定义行为,而另一个不会,或者两者都定义了行为,但是我们的行为不同。