[code]
#include
#include
int main(void)
{
int i,m,p,k,n=0;
scanf("%d",&m);
for(p=3;p<=m;p+=2)
{
/*求p的平方根*/
k=sqrt(p);
for(i=2;i<=k;i++)
{
if(p%i==0)
break;
}
if(i>=k+1)
{
printf("%d ",p);
n++;
if(n%5==0)
printf("\n");
}
}
printf("\n");
return 0;
}
[/code][code]
[root@localhost c]# gcc -Wall -lm qiantao.c
[root@localhost c]# ./a.out
20
3 5 7 11 13
17 19
[/code]代码简介:输入一个数,打印出此数以内的所有素数,5个数换一次行。C参考书上的一个例子改动。
疑问点:嵌套内的for循环当有break跳出过后,下一次再循环的时候 i 的值会被重新初始化吗,也就是i=2会重新执行一次吗?我觉得是break跳出for后,下次执行这个for,表达式1还是要重新执行一次,也就是这里的i=2会重新赋一次初始值。刚才纸上跑程序,分析有误,现已自行更改
在草稿纸上每个变量画个框,表示此变量所分配的储存空间。以此在纸上跑一下执行过程如下,(n这个变量略去分析,n只是让输出数字5个为一行):
for(表达式1;表达式2;表达式3)
for(p=3;p<=m;p+=2),①3赋值给p,②再判断表达式2,为真,执行{}里面的循环体,循环结束,③再执行表达式3,然后再返回②③重复执行,直到p<=m为假,结束循环。
1。i不会重新初始化的情况,为了说明方便,外层的for我们叫它for1,内嵌的for我们叫它for2
for1第一次循环: p为3,p<=m成立,执行循环体。k为1,i初次赋值2,i<=k不成立直接跳出for2循环,继续for1的循环体,i>=k+1成立,打印出p(p为3) ,for1循环体执行完返回执行表达式3,p+=2,p为5,第一次循环结束
for1第二次循环:第一次循环结束(结束后p为5),返回判断表达式2成立。k为2,i为2,i<=k成立执行for2循环体,求余p%i是否为0也就是判断p是不是i的整数倍(这里不成立,不会执行break而跳出for2),for2循环完,再执行表达式3,i++,i为3,继续返回for2的表达式2判断,i<=k不成立,跳出for2循环。继续执行for1的循环体,i>=k+1成立,打印出p(p为5) ,for1循环体执行完返回执行表达式3,p+=2,p为7,第二次循环结束
for1第三次循环:p为7,k为2,i为3,i<=k不成立跳出for2循环,继续for1循环,i>=k+1成立,打印出p(p为7) ,p+=2,p为9
for1第四次循环:p为9,k为3,i为3,i<=k成立,执行for2循环体,p%i==0成立执行break跳出for2循环,所以i++不会被执行,继续执行for1的循环体,i>=k+1不成立,结束循环体的执行,返回计算表达式3,P+=2,p为11
for1第五次循环:p为11,k为3,i为3,i<=k成立,i++,i为4,继续返回for2的表达式2判断,i<=k不成立,跳出for2循环。继续for1循环,i>=k+1成立,打印出p(p为11) ,p+=2,p为13
for1第六次循环:p为13,k为3,i为4,i<=K不成立跳出for2,继续for1循环,i>=k+1成立,打印出p(p为13) ,p+=2,p为15
for1第七次循环:p为15,k为3,i为4,i<=k不成立跳出for2,继续for1循环,i>=k+1成立,打印出p(p为15) ,p+=2,p为17
for1第八次循环:p为17,k为4,i为4,i<=k成立,i++,i为5,,继续返回for2的表达式2判断,i<=k不成立,跳出for2循环,继续for1循环,i>=k+1成立,打印出p(p为17) ,p+=2,p为19
for1第九次循环:p为19,k为4,i为5,i<=k不成立跳出for2,继续for1循环,i>=k+1成立,打印出p(p为19) ,p+=2,p为21
for1第十次循环:p<=m不成立,跳出for1,执行for1循环体后面的printf("\n");和return 0;
15也被打印出来了,与实际执行结果不符。这印证了这个想法是错误的,i不可能不被初始化,每个for开始执行首先就是去执行表达式1,此例中的for2的表达式1就是i=2
2。i会重新初始化的情况
详见下页。
hcconquer 于 2011-06-02 17:01:29发表:
招聘启示:
工作职责:
负责QQ后台服务器的开发
负责大容量网络服务后台架构开发
工作要求:
责任感强、有较强的逻辑思维能力、沟通能力、能够承担工作压力;
熟悉LINUX/UNIX开发环境,熟悉网络开发;
计算机或相关专业本科及以上学历,二年以上相关工作经验;
具有两年以上互联网业务开发经验或大容量网络服务相关经验者优先;
有后台业务开发、维护经验优先。
职位工作地:【深圳】
简历请发hcconquer@qq.com
deepwhite 于 2011-06-02 16:48:27发表:
分析的挺复杂,但实际上很简单:一定会初始化。
over.
yanyongkg 于 2011-06-01 21:20:00发表:
2。i会重新初始化的情况,为了说明方便,外层的for我们叫它for1,内嵌的for我们叫它for2
for1第一次循环: p为3,p<=m成立,执行循环体。k为1,i=2,i为2,i<=k不成立直接跳出for2循环,继续for1的循环体,i>=k+1成立,打印出p(p为3) ,for1循环体执行完返回执行表达式3,p+=2,p为5,第一次循环结束
for1第二次循环:第一次循环结束(结束后p为5),返回判断for1的表达式2成立。k为2,i=2,i为2,i<=k成立执行for2循环体,求余p%i是否为0也就是判断p是不是i的整数倍(这里不成立,不会执行break而跳出for2),for2循环完,再执行for2的表达式3,i++,i为3,继续返回for2的表达式2判断,i<=k不成立,跳出for2循环。继续执行for1的循环体,i>=k+1成立,打印出p(p为5) ,for1循环体执行完返回执行表达式3,p+=2,p为7,第二次循环结束
for1第三次循环:p为7,k为2,i=2,i为2,i<=k不成立跳出for2循环,继续for1循环,i>=k+1成立,打印出p(p为7) ,p+=2,p为9
for1第四次循环:p为9,k为3,i=2,i为2,i<=k成立,执行for2循环体,p%i==0成立执行break跳出for2循环,所以i++不会被执行,继续执行for1的循环体,i>=k+1不成立,结束循环体的执行,返回计算表达式3,P+=2,p为11
for1第五次循环:p为11,k为3,i=2,i为2,i<=k成立,i++,i为3,继续返回for2的表达式2判断,i<=k成立,i++,i为4,继续返回for2的表达式2判断,i<=k不成立,跳出for2循环,继续for1循环,i>=k+1成立,打印出p(p为11) ,p+=2,p为13
for1第六次循环:p为13,k为3,i=2,i为2,i<=K成立,i++,i为3,继续返回for2的表达式2判断,i<=k成立,i++,i为4,继续返回for2的表达式2判断,i<=k不成立,跳出for2循环,继续for1循环,i>=k+1成立,打印出p(p为13) ,p+=2,p为15
for1第七次循环:p为15,k为3,i=2,i为2,i<=k成立,i++,i为3,继续返回for2的表达式2判断,i<=k成立,p%i==0成立,break跳出for2循环,继续for1循环,i>=k+1不成立,不执行此if后面的打印出p的运作,p+=2,p为17
for1第八次循环:p为17,k为4,i=2,i为2,i<=k成立,i++,i为3,i<=k成立,i++,i为4,i<=k成立,i++,i为5,i<=k不成立,跳出for2循环,继续for1循环,i>=k+1成立,打印出p(p为17) ,p+=2,p为19
for1第九次循环:p为19,k为4,i=2,i为2,i<=k成立,i++,i为3,i<=k成立,i++,i为4,i<=k成立,i++,i为5,i<=k不成立,跳出for2循环,继续for1循环,i>=k+1成立,打印出p(p为19) ,p+=2,p为21
for1第十次循环:p为21,p<=m不成立,跳出for1,执行for1循环体后面的printf("\n");和return 0;
drivers 于 2011-06-01 20:58:40发表:
纯路过