#include <stdio.h>
#include <conio.h>
int main() {
int a = 2;
float b = 4;
clrscr();
printf("%d \n", a + b);
printf("%f \n", a + b);
printf("%d \n", a * b);
printf("%f \n", a * b);
printf("%d \n", b / a);
printf("%f \n", b / a);
getch();
return 0;
}
输出:-
-1293228905
6.000000
0
8.000000
0
2.000000
看起来它只是取int
数据类型的开始和结束范围。
2条答案
按热度按时间pod7payv1#
对于所有使用
%d
转换的printf
语句,您的代码都有未定义的行为。原因是您传递了float
类型的值,而printf
预期已传递了int
类型的值。为了计算表达式
a+b
,编译器将int
操作数转换为float
类型,并使用浮点计算来计算加法。结果的类型也是float
。这同样适用于其他表达式。类型
int
和float
具有不同的表示形式,可以通过不同的方式传递给vararg函数,如printf
。在printf
需要int
值的地方传递float
值会导致未定义的行为:任何事情都可能发生,试图理解令人惊讶的输出是徒劳的。如果要使用
%d
,则必须使用强制类型转换将值显式转换为int
类型:请注意,您也可以使用
%.0f
来输出不带小数的float
参数,但输出会有所不同,因为printf
会将float
值四舍五入到最接近的整数,而(int)(a + b)
会将float
值朝0
截断(如果它可以表示为int
)。最后要注意的是,当
float
值传递给printf
和其他vararg函数时,float
值会隐式提升为double
。除非您针对非常特定的应用程序(如计算机图形或嵌入式系统),否则建议对所有浮点类型使用类型double
。以下是修改后的版本:
输出:
368yc8dk2#
在C语言中,
%d
说明符用于打印int值,%f
用于打印float值。在此行中
printf("%d \n", a + b);
你试图将一个整数和一个浮点数相加,然后你使用
%d
说明符打印结果。2这显示了错误的结果作为输出。在
printf("%d \n", a * b);
这一行中,你将一个整数和一个浮点数相乘,并使用%d
说明符打印结果。它也显示了错误的输出结果。为了正确打印输出,你应该使用%f
。