首先,8/5和1是等价的,因为两个int数相除,结果也是int数。
其次,printf函数是从左往右读取参数的,然后将先读取的放到栈底,最后读取的放在栈顶,处理时则是从栈顶开始,所以我们看见的显示结果是,其实是从右边开始处理的。
最后,%lf以双精度型输出,要求输入为一个64位数。
你的程序相当于
#include<stdio.h>
int main(){
printf("%lf\n%d\n",1,1)
// 8/5就是1。
//从左往右取参数,先取%lf,64位数;再取%d,32位数。
//1是int,只有32位,所以光%lf就把两个1都取走了。%d取的是内存中后续的32位,不可预测。
//如果你把打印语句换成printf("%lf\n%d\n",1,1,3)你会发现,3正常输出了,说明%lf确实可能把两个1都取走。
//两个int型的1在内存中表示为0x0000000100000001,而按照双精度浮点型数的规则来解释这个数,就是0.
//浮点型的1.0和整型的1在内存里的表示方式是完全不同的,建议你google之。
//而8.0/5.0情况就完全不同了,商应该是一个64位的双精度浮点型数,与%lf匹配,这样第二个8/5就能顺利被%d取走。
return 0
}
希望帮到你。
欢迎分享,转载请注明来源:优选云