c语言函数参数入栈时默认是从右往左的,printf("%d %f %d",a,a,a);最右边的a最先被压入栈, 出栈时最左边的先出来,而printf在处理%f时对应的数据类型是double,也就是8个字节。那么第一个%d对应的a弹出后,%f要弹出8个字节,而int是4个字节,就是说后面两个a的8个字节数据都弹出了,那么最后一个%d实际上就越界了,所以输出随机数字 printf("%d %f %d %d",a,a,a,a); 这个也是一样的道理,第三个%d实际上输出的是第四个a的值,最后一个越界了 你这样试一下: int a=1; int b=2; printf("%d %f %d %d", a, a, a, b); 第三个a会输出b的值,而最后一个%d越界了