c语言 - 为什么这两个代码给出不同的输出?for 循环不就是一会儿的简写吗?



-我正在尝试编写一个程序来检查一个数字是否是强数。

-我用的是C语言

-我的问题是,我似乎找不到一个for和一个while循环之间的区别,即使他们看起来相同,他们总是出于某种原因给出不同的输出。

-尽管这是不是我第一次遇到这样的问题,但我似乎从来没有发现区别!

-下面是for循环的代码:(给出我期望的输出)

#include <stdio.h>
#include <stdlib.h>
int main()
{
int number, q, rem, fac = 1, result=0, i;
printf("please enter a number: ");
scanf("%d", &number);
q = number;
i = 1;
while(q != 0){
rem = q%10;
for(i = 1; i<=rem; i++){      //   <---  THE FOR LOOP HERE  ****
fac = fac*i;
}
result = result + fac;
fac = 1;
q = q/10;
}
if(number == result){
printf("%d is a strong number", number);
}
else{
printf("-%d is not a strong numbern", number);
printf("-your result was %d instead of %d", result, number);
}
return 0;
}

-这里是相同的while循环的代码:(给出错误的输出)

#include <stdio.h>
#include <stdlib.h>
int main()
{
int number, q, rem, fac = 1, result=0, i;
printf("please enter a number: ");
scanf("%d", &number);
q = number;
i = 1;
while(q != 0){
rem = q%10;
while(i <= rem){      //   <---  THE WHILE LOOP HERE  ****               
fac = fac*i;
i++;
}
result = result + fac;
fac = 1;
q = q/10;
}
if(number == result){
printf("%d is a strong number", number);
}
else{
printf("-%d is not a strong numbern", number);
printf("-your result was %d instead of %d", result, number);
}
return 0;
}

两个版本之间有一个微妙但重要的区别:

  • for(i = 1; i<=rem; i++)中,迭代变量i在每次循环出现时初始化为1
  • 在第二个版本中,while(i <= rem)使用相同的测试,循环体中的i++执行相同的增量,但是初始化i = 1;只在外部循环之前发生一次,因此行为不同。

这个问题是for循环在简单迭代中优于while循环的完美例子。强制在编码约定中使用while循环是适得其反的,例如在一些法国CS学校中强制执行的。

最新更新