c语言中for循环嵌套的执行顺序疑问

程序如下:
#include<stdio.h>int main(){ int i; int a[10]; for(i=0;i<10;i++) scanf("%d",&a[i]); for(i=0;i<10;i++); printf("%d",a[i]); printf("\n"); for(i=9;i>=0;i--) printf("%d\ ",a[i]);}
结果如下:

有俩点疑惑:
for循环嵌套的顺序是第一个为真则暂停执行下一个,直到最下层的执行完才往回跳是吧,那么为什么在程序中输入“1”,回车,然后就可以继续输入“2”,那岂不是停在了printf("\n");的地方?第三个循环为什么要等到10个数字输入完成才 会一次性出来?

i++和i--是什么时候执行的,是下级循环完成后一次性执行的还是分部执行的。

3.为什么结果中会多出一个10呢?

按照我的理解是,i=0,然后i<10为真,执行scanf,然后赋值给a[0],进入第二个循环,打印出a[0]和换行,然后卡在这里了。
接这卡的那里,为什么又直接回到scanf了,最后一个for怎么办

/* 你的程序有错,改过来之后就好理解了 */

#include<stdio.h>
int main()
{
int i;
int a[10];

for(i=0;i<10;i++)
scanf("%d",&a[i]);

/* 这里末尾多了一个分号,所以是空循环
for(i=0;i<10;i++); 
printf("%d",a[i]);
修改如下: */
for(i=0;i<10;i++)
printf("%d",a[i]);

printf("\n");

for(i=9;i>=0;i--)
printf("%d\ ",a[i]);

return 0;
}

追问

哪里多了分号啊没看明白

意思是第二个for是空的,只是一直把第一个运行了,然后直接运行了第二个的printf运行了一次. 这里明白了,剩下就是假定那个分号没有,嵌套循环中两个i++分别是什么执行顺序? 然后还是那个为啥是空循环,依然从上之下都输出了输入的数字?

追答

第一个for你如果不加大括号不会包括第一个for循环,也就是说假如没有大括号那么for循环体只是你接下来的一行代码。
另外,在多层循环里面不能同时使用同一个下标,可以第一层使用i,第二层要在定义一个变量j做循环;
如果for(i=0;i<10;i++);后面有个分号,那么这个循环体就是空的,分号直接就结束了

追问

明白了,最后请教一下假如是嵌套for循环,都有i++ j++的话,是不是第一个for条件为真,执行下一句,第二个for为真,执行语句,一遍过后j++,这时候一直把这个for执行完再跳回还是直接跳回第一个for继续往下重复?(感觉是第二种好像…)

追答

假如有以下二层循环:

for(i=0;i<10;i++)
    for(j=0;j<10;j++)
        printf("%d, %d\n", i, j);

C语言是面向过程的语言,代码都是按顺序从上往下执行的:

    第一个for执行:i=0

    判断 i < 10是否成立,成立跳到3,若不成立则退出循环跳转到10

    执行第二个for:j=0

    判断 j<10是否成立,成立跳到5,不成立退出第二个for循环跳转到8

    执行 printf语句

    执行 j++

    跳转到4

    执行i++

    跳转到2

    循环结束


这样写明白了么?

追问

没明白那几个跳转的数字,不知道是说的跳到哪里 先采纳吧非常感谢了 再看看书

追答

跳转到第N步,不是写了1-10步么?
结合代码也应该能猜到那几个跳转指的是10步里面的第几步吧?囧

温馨提示:答案为网友推荐,仅供参考
第1个回答  2015-03-09
for(i=0;i<10;i++); 这个循环后面跟的是空语句,什么也没做,printf("%d",a[i]);这里i已经是10了,a[10]是一个不确定的值,这里是10,你下次执行就不一定是10了。多的那个10是a[10],数组已经越界了。追问

第二个for那多了个分号,既然是空循环那为什么在运行中依然正常输出了呢? 然后就是i++的执行点是在哪呢

意思是第二个for是空的,只是一直把第一个运行了,然后直接运行了第二个的printf运行了一次. 这里明白了,剩下就是假定那个分号没有,嵌套循环中两个i++分别是什么执行顺序? 然后还是那个为啥是空循环,依然从上之下都输出了输入的数字?

相似回答