请哪位告诉我这里的问题?

#include <stdio.h>
#include <stdlib.h>
int main()
{
int i,j;
int x=0;
int y=10;
char input;

while(1)        
{
    system("cls");
for(j=0;j<y;j++)
printf("\n");
for(i=0;i<x;i++)
printf(" ");


 printf("*\n");
 
 scanf("%c",&input);
if(input=='s') 
    y++;
if(input=='w') 
    y--;
if(input=='a') 
    x--;
if(input=='d') 
    x++;

}
return 0;
}

#include <stdio.h>
#include <stdlib.h>
int main()
{
int i,j;
int x=0;
int y=10;
char input;

while(1)        
{
    system("cls");

for(i=0;i<x;i++)
printf(" ");
for(j=0;j<y;j++)
printf("\n");

 printf("*\n");
 
 scanf("%c",&input);
if(input=='s') 
    y++;
if(input=='w') 
    y--;
if(input=='a') 
    x--;
if(input=='d') 
    x++;

}
return 0;
}
这两个代码中
for(j=0;j<y;j++)
printf("\n");
for(i=0;i<x;i++)
printf(" ");
前两个和后两个代码换下位置,而运行过程中第一个按a和d会左右移动而第二个不会移动了呢?

因为第一份代码先打印由初识变量y控制的换行,然后打印有变量x控制的0个空格,然后打印一个星号再换行,等待输入移动命令,输入a或d就会把x的值增加或减少,然后等下次开始执行while循环开头的输出换行和输出空格实现显示出星号左右移动的功能,因为是先换行,再输出空格,所以第一份代码的左右移动可以显示出来(在换行输出后,空格输出没有被"覆盖",且和星号输出连接在一起输出, 上一次输入的x的值控制输出多少个空格实现星号左右移动);


但第二份代码是先输出空格,再输出换行,所以由输出的空格没有和星号再一起输出,并且被后面的换行输出"覆盖"了显示,所以第二份代码输出的空格不能实现出星号左右移动的功能,星号永远在左边第一个位置。

img