0

我正在尝试编写一个列出给定数字的因素的程序。当我写这个时它起作用:

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 循环的格式。有人可以指出我的错误吗?

4

4 回答 4

7

i=1在这种情况下,您应该使用as in开始循环for(i = 1; i <= num; ++i),否则您将尝试将数字除以0。因素永远不可能0

于 2013-08-03T19:48:05.007 回答
5

i == 0是一个没有副作用的表达式,所以 writefor(i == 0; i <= num; ++i)与 writing 相同for(; i <= num; ++i),即它只是在初始化部分什么都不做。现在,由于您从未在任何地方初始化i,这意味着您调用了未定义的行为。

如果你这样做i = 0,i被初始化,但你仍然调用未定义的行为:num % i将导致除以零,因为i在开始时将是 0。

现在碰巧在您的系统上,除以零导致您的程序崩溃,而您使用的未初始化的版本碰巧在没有崩溃的情况下运行。这就是为什么您可能认为使用i==0“工作”的版本。

于 2013-08-03T19:51:27.040 回答
1

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

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

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

于 2013-08-03T19:48:17.543 回答
0

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

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

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

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

于 2013-08-03T20:00:05.657 回答