|
发表于 2014-10-4 22:29:32
|
显示全部楼层
首先,printf函数会自动将float类型的参数自动转换为double类型的参数。
所以printf("(int)f=%d, f=%f\n",f,f);函数的3个参数类型为const char*,double,double
double类型在32位系统下占据8个字节。
C语言对函数的处理是先将函数参数从右到左入栈,然后函数体内在读取这些参数进行处理。
所以printf函数被调用前会先将两个f(double类型)入栈,再将const char*类型参数(即字符串地址)入栈。
于是这三个参数在堆栈中的地址可能为(这仅仅是假设的情况):
const char*类型参数地址: 4
第一个f参数地址: 8
第二个f参数地址: 16
而printf中的格式化字符串中是%d...%f所以printf函数会将地址8处的参数认为是一个int类型(即取该double类型的低4字节地址作为int类型),紧接着取地址12处的8个字节作为第2个double参数,所以这两个参数都错了。
根据上面的分析,你可以将
printf("(int)f=%d, f=%f\n",f,f);改为
printf("(int)f=%f, f=%d\n",f,f);就会发现第一个参数%f正确的打印出来了。 |
|