C语言 当使用int和float数据类型时,为什么“%d”的输出看起来不同?

wribegjk  于 2023-01-01  发布在  其他
关注(0)|答案(2)|浏览(412)
#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数据类型的开始和结束范围。

pod7payv

pod7payv1#

对于所有使用%d转换的printf语句,您的代码都有未定义的行为。原因是您传递了float类型的值,而printf预期已传递了int类型的值。
为了计算表达式a+b,编译器将int操作数转换为float类型,并使用浮点计算来计算加法。结果的类型也是float。这同样适用于其他表达式。
类型intfloat具有不同的表示形式,可以通过不同的方式传递给vararg函数,如printf。在printf需要int值的地方传递float值会导致未定义的行为:任何事情都可能发生,试图理解令人惊讶的输出是徒劳的。
如果要使用%d,则必须使用强制类型转换将值显式转换为int类型:

printf("%d \n", (int)(a + b));

请注意,您也可以使用%.0f来输出不带小数的float参数,但输出会有所不同,因为printf会将float值四舍五入到最接近的整数,而(int)(a + b)会将float值朝0截断(如果它可以表示为int)。
最后要注意的是,当float值传递给printf和其他vararg函数时,float值会隐式提升为double。除非您针对非常特定的应用程序(如计算机图形或嵌入式系统),否则建议对所有浮点类型使用类型double
以下是修改后的版本:

#include <stdio.h>

int main() {
    int a = 2;
    double b = 4;

    printf("a+b: %f  %d  %.0f\n", a + b, (int)(a + b), a + b);
    printf("a*b: %f  %d  %.0f\n", a * b, (int)(a * b), a * b);
    printf("a/b: %f  %d  %.0f\n", a / b, (int)(a / b), a / b);
    printf("b/a: %f  %d  %.0f\n", b / a, (int)(b / a), b / a);
    getchar();
    return 0;
}

输出:

a+b: 5.000000  5  5
a*b: 6.000000  6  6
a/b: 0.666667  0  1
b/a: 1.500000  1  2
368yc8dk

368yc8dk2#

在C语言中,%d说明符用于打印int值,%f用于打印float值。
在此行中printf("%d \n", a + b);
你试图将一个整数和一个浮点数相加,然后你使用%d说明符打印结果。2这显示了错误的结果作为输出。
printf("%d \n", a * b);这一行中,你将一个整数和一个浮点数相乘,并使用%d说明符打印结果。它也显示了错误的输出结果。为了正确打印输出,你应该使用%f

相关问题