C语言里的for语句怎么用?
我正在学习谭浩强的C语言基础教程,现在学到FOR语句时就卡住了,无论如何也不能理解透彻,现有多个问题请教,请高手们用最通俗易懂的表达方式来教教我吧!1.单个循环我看得懂,...
我正在学习谭浩强的C语言基础教程,现在学到FOR语句时就卡住了,无论如何也不能理解透彻,现有多个问题请教,请高手们用最通俗易懂的表达方式来教教我吧!
1. 单个循环我看得懂,可嵌套循环我就理解不了了。看下面例题:
main()
{
int i, j, k;
printf("i j k\n");
for (i=0; i<2; i++)
for(j=0; j<2; j++)
for(k=0; k<2; k++)
printf(“%d %d %d\n", i, j, k);
}
输出结果:
i j k
0 0 0
0 0 1
0 1 0
0 1 1
1 0 0
1 0 1
1 1 0
1 1 1
不知道为什么是这个结果,我们初学者很难理解啊!请说明一下它是怎么循环的?最好一步一步分解出来!
2. 当FOR语句的3个表达式都省略时,即for(;;),它相当于while(1),之前学while语句时,后面括号里都是条件表达式,如i<100,现在这个while(1)是什么意思?怎么理解它?请举个简单的例子说明一下。
3. 绕过了FOR语句,学习下一章数组,书理讲的很抽象,看了N多遍都理解不透彻,特别是二维数组和多维数组在这里重新请教一下前辈们,请用最简单的语言撬撬我这死脑筋吧!
顺便看一下这个例子(好像是来排序的),并附上它的运行过程吧:
main()
{
int i,j,p,q,s,a[10];
printf("\n input 10 numbers:\n");
for(i=0;i<10;i++)
scanf("%d",&a[i]);
for(i=0;i<10;i++){
p=i;q=a[i];
for(j=i+1;j<10;j++)
if(q<a[j]) { p=j;q=a[j]; }
if(i!=p)
{s=a[i];
a[i]=a[p];
a[p]=s; }
printf("%d",a[i]);
}
}
晚上的答案就不要复制过来了,我搜了很多看得一头雾水,还不如书本呢!
让我满意的,分数x2! 展开
1. 单个循环我看得懂,可嵌套循环我就理解不了了。看下面例题:
main()
{
int i, j, k;
printf("i j k\n");
for (i=0; i<2; i++)
for(j=0; j<2; j++)
for(k=0; k<2; k++)
printf(“%d %d %d\n", i, j, k);
}
输出结果:
i j k
0 0 0
0 0 1
0 1 0
0 1 1
1 0 0
1 0 1
1 1 0
1 1 1
不知道为什么是这个结果,我们初学者很难理解啊!请说明一下它是怎么循环的?最好一步一步分解出来!
2. 当FOR语句的3个表达式都省略时,即for(;;),它相当于while(1),之前学while语句时,后面括号里都是条件表达式,如i<100,现在这个while(1)是什么意思?怎么理解它?请举个简单的例子说明一下。
3. 绕过了FOR语句,学习下一章数组,书理讲的很抽象,看了N多遍都理解不透彻,特别是二维数组和多维数组在这里重新请教一下前辈们,请用最简单的语言撬撬我这死脑筋吧!
顺便看一下这个例子(好像是来排序的),并附上它的运行过程吧:
main()
{
int i,j,p,q,s,a[10];
printf("\n input 10 numbers:\n");
for(i=0;i<10;i++)
scanf("%d",&a[i]);
for(i=0;i<10;i++){
p=i;q=a[i];
for(j=i+1;j<10;j++)
if(q<a[j]) { p=j;q=a[j]; }
if(i!=p)
{s=a[i];
a[i]=a[p];
a[p]=s; }
printf("%d",a[i]);
}
}
晚上的答案就不要复制过来了,我搜了很多看得一头雾水,还不如书本呢!
让我满意的,分数x2! 展开
9个回答
展开全部
对于问题1
我们只讨论循环:
开始
for (i=0; i<2; i++)
i=0 往下执行 for(j=0; j<2; j++)
j=0往下执行 for(k=0; k<2; k++)
k=0 往下执行 printf(“%d %d %d\n", i, j, k);
输出 i j k 显然输出的是 0 0 0
输出后执行 k++, k值变为1 与2比较 显然 k<2 继续执行 输出
此时 i=0 j=0 k=1 输出为 0 0 1
输出后执行 k++, k值变为2 与2比较 显然 2<2 为假,跳出k循环回到上一级循环执行 j++
j=1与2比较 显然1<2 往下执行(此时i=0 , j=1)再次执行k循环int k=0
将k值重新赋值为0 执行输出 此时 i=0 j=1 k=0 输出 0 1 0
执行输出后k++,k值为1与2比较 显然1<2 继续 k的循环 此时k=2,j=1 i=0
执行输出为 0 1 1
输出后k++ ,k值为2与2比较 2<2为假跳出k循环 返回j循环 返回时k=2,j=1 i=0 执行j++ ,j的值为 2显然 2<2为假 ,跳出j循环 返回i循环 此时k=2,j=2 i=0, 执行i++,i值为1 与2比较 显然1<2 往下执行
i=1,执行 j 循环 int j=0 j值变为0
j=0 向下执行 k循环 int jk=0 k值变为0
k=0 向下执行输出 此时 i=1 j=0 k=0 输出 1 0 0
(此时回到了i=0的开始情况 )
参照前面的分析继续执行 依次会 输出 1 0 1
1 1 0
1 1 1
当输出到 1 1 1 的 时候继续想下执行k++,k值变为2 与2比较 结果为假回到j循环此时 i=1,j=1 ,k=2 ;执行j 循环中的j++,j值为2与2比较 结果为假回到i循环此时 i=1,j=2 ,k=2 ;执行i 循环中的i++,i值为2与2比较 结果为假退出循环 此时i=2,j=2 ,k=2;退出循环后下下执行结束程序
对于问题2 while(1)就是条件为永真 你用while(3) while(2) 都可以 就是while()函数的语句不停的执行 ,此时只能用跳转或者break 语句来跳出循环
但是while(0)表示永假 即while()里面的不执行 当然do while()除外 它是先执行后判断,但是也仅仅执行席次就不在执行了for(;;)里面空的意思就是条件为永真,没有退出的判别条件也就是相当于while(1)(习惯用 1 0 表示真假) 当然也可以用break或者跳转退出循环,但是那和for(;;)的判断无关。 所以for(;;)简单的讲就是条件为永真 循环不断的执行 除非遇到函数内部的跳转 或者函数里面嵌套的判断退出为止
eg : 1>
int i=0;
int j=0;
for(;;) {i++;
j++ ;} //不停的死循环
2>int i=0;
int j=0;
for(;;) {i++;
j++ ;
if(i>10)break;
}
不停的循环直到i>10由内部判断退出循环
对于问题3 你只要将 1维理解 和for语句的一维理解透彻 再在此基础上扩展就行了
多维数组可以分解为多个一维数组的 多个for的嵌套同样可以分解为一个一个的循环
只要很清晰的知道 数组下标 与判断时候条件值的状态 就好分析了
对于初学者来数 数组画图分析 以表格的形式在纸上分析,而循环语句同样的将判断的条件分解来 在纸上模拟,一步一步的跟进状态 从简单的开始慢慢深入 ,不怕麻烦 仔细研究很如意理解的.
我们只讨论循环:
开始
for (i=0; i<2; i++)
i=0 往下执行 for(j=0; j<2; j++)
j=0往下执行 for(k=0; k<2; k++)
k=0 往下执行 printf(“%d %d %d\n", i, j, k);
输出 i j k 显然输出的是 0 0 0
输出后执行 k++, k值变为1 与2比较 显然 k<2 继续执行 输出
此时 i=0 j=0 k=1 输出为 0 0 1
输出后执行 k++, k值变为2 与2比较 显然 2<2 为假,跳出k循环回到上一级循环执行 j++
j=1与2比较 显然1<2 往下执行(此时i=0 , j=1)再次执行k循环int k=0
将k值重新赋值为0 执行输出 此时 i=0 j=1 k=0 输出 0 1 0
执行输出后k++,k值为1与2比较 显然1<2 继续 k的循环 此时k=2,j=1 i=0
执行输出为 0 1 1
输出后k++ ,k值为2与2比较 2<2为假跳出k循环 返回j循环 返回时k=2,j=1 i=0 执行j++ ,j的值为 2显然 2<2为假 ,跳出j循环 返回i循环 此时k=2,j=2 i=0, 执行i++,i值为1 与2比较 显然1<2 往下执行
i=1,执行 j 循环 int j=0 j值变为0
j=0 向下执行 k循环 int jk=0 k值变为0
k=0 向下执行输出 此时 i=1 j=0 k=0 输出 1 0 0
(此时回到了i=0的开始情况 )
参照前面的分析继续执行 依次会 输出 1 0 1
1 1 0
1 1 1
当输出到 1 1 1 的 时候继续想下执行k++,k值变为2 与2比较 结果为假回到j循环此时 i=1,j=1 ,k=2 ;执行j 循环中的j++,j值为2与2比较 结果为假回到i循环此时 i=1,j=2 ,k=2 ;执行i 循环中的i++,i值为2与2比较 结果为假退出循环 此时i=2,j=2 ,k=2;退出循环后下下执行结束程序
对于问题2 while(1)就是条件为永真 你用while(3) while(2) 都可以 就是while()函数的语句不停的执行 ,此时只能用跳转或者break 语句来跳出循环
但是while(0)表示永假 即while()里面的不执行 当然do while()除外 它是先执行后判断,但是也仅仅执行席次就不在执行了for(;;)里面空的意思就是条件为永真,没有退出的判别条件也就是相当于while(1)(习惯用 1 0 表示真假) 当然也可以用break或者跳转退出循环,但是那和for(;;)的判断无关。 所以for(;;)简单的讲就是条件为永真 循环不断的执行 除非遇到函数内部的跳转 或者函数里面嵌套的判断退出为止
eg : 1>
int i=0;
int j=0;
for(;;) {i++;
j++ ;} //不停的死循环
2>int i=0;
int j=0;
for(;;) {i++;
j++ ;
if(i>10)break;
}
不停的循环直到i>10由内部判断退出循环
对于问题3 你只要将 1维理解 和for语句的一维理解透彻 再在此基础上扩展就行了
多维数组可以分解为多个一维数组的 多个for的嵌套同样可以分解为一个一个的循环
只要很清晰的知道 数组下标 与判断时候条件值的状态 就好分析了
对于初学者来数 数组画图分析 以表格的形式在纸上分析,而循环语句同样的将判断的条件分解来 在纸上模拟,一步一步的跟进状态 从简单的开始慢慢深入 ,不怕麻烦 仔细研究很如意理解的.
展开全部
很简单 一两句说不清
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
在线来啊!!!
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
还是自己多看看把..
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
够用心,相信你可以的
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
对于你的程序
main()
{
int i, j, k; 1
printf("i j k\n"); 2
for (i=0; i<2; i++) -------------------------- 3
for(j=0; j<2; j++) -------------------------- 4
for(k=0; k<2; k++) -------------------------- 5
printf(“%d %d %d\n", i, j, k); -------------- 6
}
输出结果:
i j k
0 0 0
0 0 1
0 1 0
0 1 1
1 0 0
1 0 1
1 1 0
1 1 1
程序先执行printf语句 输出ij k
然后执行for循环 先执行3语句由于 i=0, i<2 所以执行下一语句
执行4的for循环 j=0 j<2 所以执行下一语句
执行5语句for循环 k=0 k<2 所以执行下一语句
执行6的printf语句 输出 0 0 0 由于k的循环没执行完 返回5 语句
执行5for中的 k++ k=1 k<2 执行下一语句 6 输出 0 0 1 然后再回5 由于k=2 停止 执行4语句
j++ j=1 j<2 开始执行下一语句 5语句 k赋值0 在开始5、6语句的循环 依次结果是 0 1 0/ 0 1 1
当j=2 时 不在是j<2 开始执行3语句 对j赋值0开始再次循环
main()
{
int i, j, k; 1
printf("i j k\n"); 2
for (i=0; i<2; i++) -------------------------- 3
for(j=0; j<2; j++) -------------------------- 4
for(k=0; k<2; k++) -------------------------- 5
printf(“%d %d %d\n", i, j, k); -------------- 6
}
输出结果:
i j k
0 0 0
0 0 1
0 1 0
0 1 1
1 0 0
1 0 1
1 1 0
1 1 1
程序先执行printf语句 输出ij k
然后执行for循环 先执行3语句由于 i=0, i<2 所以执行下一语句
执行4的for循环 j=0 j<2 所以执行下一语句
执行5语句for循环 k=0 k<2 所以执行下一语句
执行6的printf语句 输出 0 0 0 由于k的循环没执行完 返回5 语句
执行5for中的 k++ k=1 k<2 执行下一语句 6 输出 0 0 1 然后再回5 由于k=2 停止 执行4语句
j++ j=1 j<2 开始执行下一语句 5语句 k赋值0 在开始5、6语句的循环 依次结果是 0 1 0/ 0 1 1
当j=2 时 不在是j<2 开始执行3语句 对j赋值0开始再次循环
参考资料: 自己
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询