当我写“i == 0”而不是当C中的“i = 0”时,循环工作?

时间:2013-08-03 19:44:25

标签: 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循环

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

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

4 个答案:

答案 0 :(得分:7)

您应该使用i=1中的for(i = 1; i <= num; ++i)启动循环,否则您尝试将数字除以0。因素永远不会是0

答案 1 :(得分:5)

i == 0是一个没有副作用的表达式,因此写for(i == 0; i <= num; ++i)与写for(; i <= num; ++i)相同,即它在初始化部分中什么都不做。既然你从未在任何地方初始化i,这意味着你调用未定义的行为。

如果执行i = 0,则i已初始化,但仍会调用未定义的行为:num % i将导致除以零,因为i在开头将为0。

现在碰巧在你的系统上,除零导致你的程序崩溃,而你使用我未初始化的版本碰巧运行而没有崩溃。这就是为什么你可能已经看到使用i==0的版本“工作”。

答案 2 :(得分:1)

在C中有两个看起来有些相似的独立运算符 - 一个使用单个等号的赋值语句,以及一个使用两个等号的相等比较。两者不应混淆(尽管它们经常是混淆)。

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

但是,您的代码不起作用,因为它具有未定义的行为:i在整个循环中保持未初始化状态,使您的程序无效。

答案 3 :(得分:0)

for循环的第一部分是定义迭代器的起始值(i)。 由于您没有初始化它,它可能有一个未定义的值,或者有时只是垃圾值......

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

所以实际上正确的是:       for(i=0; i<something; i++) // or ++i, doesn't mater 编辑:哦是啊...并且for循环的起始值为0,something % i等于something % 0,这意味着你将除法归零。

编辑2:我看到它已被提及......