C 为什么printf隐式浮点到int的转换不起作用?

C 为什么printf隐式浮点到int的转换不起作用?,c,printf,C,Printf,请帮助我理解以下C输出: #include<stdio.h> int main() { float x = 4.0; printf("%f\n",x); printf("%d\n",x); int y=x; printf("%d\n",y); return 0; } 据我所知,当我们将float赋值给int变量时,变量的小数部分被终止,然后赋值给int 为什么在这种情况下不会发生这种情况?您没有打印y,而是再次打印x 作为旁注,pri

请帮助我理解以下C输出:

#include<stdio.h>
int main() {
    float x = 4.0;
    printf("%f\n",x);
    printf("%d\n",x);
    int y=x;
    printf("%d\n",y);
    return 0;
}
据我所知,当我们将float赋值给int变量时,变量的小数部分被终止,然后赋值给int


为什么在这种情况下不会发生这种情况?

您没有打印
y
,而是再次打印
x


作为旁注,
printf
无法进行转换。因此,当需要
%d
时传递一个浮点值是未定义的行为。

您没有打印
y
,而是再次打印
x

作为旁注,
printf
无法进行转换。因此,当需要
%d
时传递浮点是未定义的行为

据我所知,当我们将float赋值给int变量时 变量的小数部分终止,然后分配给 内部的

语句是正确的,但要进行此转换,您必须转换希望转换的变量,而不仅仅是将其分配给另一个int变量

这也会导致
printf
语句中出现问题,因为您使用int说明符
%d
打印浮点变量时没有强制转换

修复如下代码:

printf("%d\n", (int) x);
                 ^
                 | this is the cast operation
它将正确打印变量
x
的整数值
4

据我所知,当我们将float赋值给int变量时 变量的小数部分终止,然后分配给 内部的

语句是正确的,但要进行此转换,您必须转换希望转换的变量,而不仅仅是将其分配给另一个int变量

这也会导致
printf
语句中出现问题,因为您使用int说明符
%d
打印浮点变量时没有强制转换

修复如下代码:

printf("%d\n", (int) x);
                 ^
                 | this is the cast operation

它将正确打印变量
x
的整数值
4

当作为
参数传递时,
浮点值将自动提升为
双倍值(
字符
短整数
提升为
整数的方式类似)。当
printf()
查看格式说明符(
%d
%f
或任何内容)时,它根据格式说明符(如
int
double
或任何内容)获取并解释它接收到的原始数据,然后打印它

printf(“%d\n”,x)
是错误的,因为您正在将一个
double
传递给
printf()
printf()
让你为谎言付出代价。它从参数中获取4个字节(很可能,但不一定是4个字节),即
int
的大小,它从先前放置
double
4.0的8个字节(同样,很可能,但不一定是8个字节)的位置获取这些字节,其中的4个字节恰好都是零,然后它将它们解释为一个整数并打印出来。事实上,IEEE-754双精度格式中的2次幂通常有52个零位,或超过6个8位的零字节


这些“最有可能,但不一定”的词意味着C标准并不要求类型有一个固定的大小和范围,它们可能因编译器而异,因操作系统而异。最近的4个字节<代码> int <代码> > 8字节>代码>双倍< /代码>是最常见的(如果我们考虑的话,例如x86平台)。. 当
printf()
查看格式说明符(
%d
%f
或任何内容)时,它根据格式说明符(如
int
double
或任何内容)获取并解释它接收到的原始数据,然后打印它

printf(“%d\n”,x)
是错误的,因为您正在将一个
double
传递给
printf()
printf()
让你为谎言付出代价。它从参数中获取4个字节(很可能,但不一定是4个字节),即
int
的大小,它从先前放置
double
4.0的8个字节(同样,很可能,但不一定是8个字节)的位置获取这些字节,其中的4个字节恰好都是零,然后它将它们解释为一个整数并打印出来。事实上,IEEE-754双精度格式中的2次幂通常有52个零位,或超过6个8位的零字节


这些“最有可能,但不一定”的词意味着C标准并不要求类型有一个固定的大小和范围,它们可能因编译器而异,因操作系统而异。最近的4个字节<代码> int <代码>和8字节>代码>双倍是最常见的(如果我们考虑,例如x86平台).< /p>是否意味着在最后一个打印语句中输出<代码> x <代码>?不是
y
.thnx所有的…我问了一个愚蠢的问题…还有代码中的一个错误…我想在最后一个语句中打印y可能的重复您想在最后一个打印语句中输出
x
吗?最后一个
printf
再次打印
x
,不是
y
.thnx所有的…我问了一个愚蠢的问题…还有代码中的一个错误…我想在最后一个语句中打印y可能的重复项你能告诉我强制转换和转换的区别吗?你能告诉我强制转换和转换的区别吗?