的结果
printf("%d\n", 5.0 + 2);
是0
但
int num = 5.0 + 2;
printf("%d\n", num);
Run Code Online (Sandbox Code Playgroud)
是7
这两者有什么区别?
结果5.0 + 2是7.0和是类型double.
该"%d"格式是打印int.
不匹配的格式规范和参数类型会导致未定义的行为.
要与您一起打印float或double值,printf请使用该格式"%f".
同
int num = 5.0 + 2;
Run Code Online (Sandbox Code Playgroud)
您将结果5.0 + 2转换为int值7.然后int使用正确的格式说明符打印该值.
在所有表达式中,每个操作数都有一个类型.5.0有类型double.2有类型int.
只要double和integer用作同一运算符的操作数,整数就会在计算之前以无提示方式转换为double.结果是类型double.
所以你传递double给了printf,但是你告诉它期待一个int,因为你使用过%d.结果是一个错误,结果没有定义.
但是,如果是int num = 5.0 + 2;,你首先得到一个结果double,7.0.然后强制转换回int.该代码相当于:
int num = (int)((double)5.0 + (double)2);
Run Code Online (Sandbox Code Playgroud)
更多细节:隐式类型促销规则