新手,关于while语句中变量值的变化

新手求助,关于while语句中变量值的变化
今天练习时写了一个简单的while循环,但在写的时候不小心写错了,但却出现了出人意料的结果。代码如下:
#include<stdio.h>
#include<string.h>
#define siz 4
int main(void)
{
int l=0,a[10],size,num,i=0;
while(i<10)
{
scanf("%d%",&l);
a[i]=l;
++i;
}
}

在scanf语句中多加了一个%号,但在运行时,需要输入11个int型数据,其中前10个存入数组中,通过变量跟踪,发现i=0时,需要输入两个int型数字,我在此时输入0和1,循环致i=1,些时只需输入一个int型数字,我输入2,可是在给a[1]赋值时,是将1赋值给a[1],而不是2.难道此时l不应该是2吗?scanf语句中%d后面的%起的什么作用?
请高手帮忙解答,谢谢!!

------解决方案--------------------
他说的是“转义符”,我觉得更像是起了占位符的作用。
按理说scanf获得输入时,应该严格按照scanf""双引号之间的样式输入,但是多出的这个%,让系统在你输入一个数字后不能立即返回,而是等待你输入后面的内容(一个数字,或控制字符)。于是你输入了第二个数字【1】,输入函数结束。
但是这样并不会丢失数据,也就是说你输入01,2,3,4,5.。则结果为a[0]=0 a[1]=1 a[2]=2...


------解决方案--------------------
VC调试(TC或BC用TD调试)时按Alt+8、Alt+6和Alt+5,打开汇编窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应内存和寄存器变化,这样过一遍不就啥都明白了吗。
对VC来说,所谓‘调试时’就是编译连接通过以后,按F10或F11键单步执行一步以后的时候,或者在某行按F9设了断点后按F5执行停在该断点处的时候。
(Linux或Unix下可以在用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。)
想要从本质上理解C指针,必须学习汇编以及C和汇编的对应关系。
从汇编的角度理解和学习C语言的指针,原本看似复杂的东西就会变得非常简单!
指针即地址。“地址又是啥?”“只能从汇编语言和计算机组成原理的角度去解释了。”

提醒:
“学习用汇编语言写程序”

“VC调试(TC或BC用TD调试)时按Alt+8、Alt+6和Alt+5,打开汇编窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应内存和寄存器变化,这样过一遍不就啥都明白了吗。
(Linux或Unix下可以在用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。)
想要从本质上理解C指针,必须学习C和汇编的对应关系。”
不是一回事!

不要迷信书、考题、老师、回帖;
要迷信CPU、编译器、调试器、运行结果。
并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。
任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实!

不要写连自己也预测不了结果的代码!