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

sup*_*dso 0 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);
        }
    }
 }
Run Code Online (Sandbox Code Playgroud)

但是当for循环是

for(i = 0; i <= num; ++i)
Run Code Online (Sandbox Code Playgroud)

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

小智 7

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


sep*_*p2k 5

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

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

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