我已经开始重新学习C(自学),并遇到了一个if语句并不总是在循环内执行的问题。奇怪的是,它自己,函数执行正确,但除非我添加一个printf()语句引用循环中的变量,否则它不会尝试测试if语句。
具体来说,main(void)函数的while循环中的printf("%d ", aCounter);
行是它尝试测试if语句所需要的。我在使用for循环时遇到了类似的问题(正如你所看到的,它被注释掉了)。我很困惑为什么没有提到的printf()就不测试if语句。然而,它确实通过printf()语句成功地找到了:1、6、24、28和496。它只找到&;1&;没有它。
#include <stdio.h>
int isPerfect(unsigned int n);
int main(void) {
/* for (unsigned int i = 1; i <= 1000; i++) {
if (isPerfect(i) == 1) {
printf("%d is perfectn", i);
}
}
*/
int aCounter = 0;
while (aCounter < 1000) {
aCounter++;
if (isPerfect(aCounter) == 1 ) {
printf("%d is perfectn", aCounter);
for (int aTemp = 1; aTemp < aCounter; aTemp++) {
if (aCounter % aTemp ==0) {
printf("%d is a factor of %dn", aTemp, aCounter);
}
}
}
printf("%d ", aCounter);
//aCounter++;
}
int a = 6;
if (isPerfect(a) == 1 ) {
printf("%d is perfectn", a);
}
printf("%d is perfect: %dn", 6, isPerfect(6));
printf("%d is NOT perfect: %dn", 8, isPerfect(8));
printf("%d is perfect: %dn", 6, isPerfect(6));
}
int isPerfect(unsigned int n) {
int aNumber;
for (int i =1; i <= n; i++) {
if (n % i == 0) {
aNumber += i;
if (aNumber == n)
{
return 1;
}
}
}
return 0;
}
我不确定程序的预期输出,但我可以看到,在isPerfect(unsigned int n)
函数中,我们有一个语句aNumber += i;
,它基本上是aNumber = aNumber + 1;
,即将aNumber
的值更新为1。但是正如我们所看到的,在定义aNumber
的函数中的第一个语句中,它没有初始化,因此将其值更新为1似乎毫无意义,因为它的前一个值是未知的。初始化它的值,比如int aNumber = 0;
会做的。
但是C语言中未初始化的变量不一定总是包含垃圾值
自动(局部)变量不保证为零,可以包含垃圾,但全局变量和静态变量保证是0
请参考这篇帖子StackOverflow帖子了解更多细节。
.