我正在尝试编写一个列出给定数字因子的程序。它写的时候有用:
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循环的格式。有人可以指出我的错误吗?
答案 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:我看到它已被提及......