的结果
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)
更多细节:隐式类型促销规则