当我运行以下代码时
#include <stdio.h>
#include <stdlib.h>
int main(){
printf("2/10=%lf 2./10=%lf\n", 2/10, 2./10);
printf("2/10=%lf\n",2/10);
printf("2/10=%d\n",2/10);
printf("2./10=%lf\n",2./10);
return 0;
}
我预计它会返回
2/10=0.000000 2./10=0.200000
2/10=0.000000
2/10=0
2./10=0.200000
而我得到
2/10=0.200000 2./10=0.000000
2/10=0.200000
2/10=0
2./10=0.200000
在稍微思考后,我可以理解,在第一行中2/10
可以被解释为浮点除法而不是整数1,因为我已将%lf
说明符放在printf()
中(是真的会发生什么?)但我无法解释的是,为什么以下2./10
打印0.000000
而不是0.200000
,就像它在第4行中那样。
任何人都可以向我解释一下吗?
编辑:
如果我稍微更改代码,我会
#include <stdio.h>
#include <stdlib.h>
int main(){
printf("2/10=%lf\n",2/10);
printf("2/10=%lf 2./10=%lf\n", 2/10, 2./10);
printf("2/10=%d\n",2/10);
printf("2./10=%lf\n",2./10);
return 0;
}
2/10=0.000000
2/10=0.200000 2./10=0.000000
2/10=0
2./10=0.200000
似乎支持这样的观点,即第二个0.2
语句中的printf()
实际上与同一2./10
中的0.0
和printf()
的计算相对应}语句对某些未定义的行为......
答案 0 :(得分:4)
2/10
(整数除法)正在生成0
类型int
。使用错误的转换规范器打印数据会调用未定义的行为。
如果转换规范无效,则行为未定义。 282)如果任何参数是 不是相应转换规范的正确类型,行为是 未定义。