C 当我与格式说明符不匹配时,为什么要接收不同变量的值?

C 当我与格式说明符不匹配时,为什么要接收不同变量的值?,c,floating-point,format,printf,specifier,C,Floating Point,Format,Printf,Specifier,当我运行此代码时,D的输出作为C的值显示出来。是因为我调用了一个float,它只接受内存中最近的一个float吗 #include <stdio.h> int main() { int a=3/2; printf("The value of 3/2 is : %d\n", a ); float b=3.0/2; printf("The value of 3/2 is : %f\n", b ); float c=7.0/2;

当我运行此代码时,D的输出作为C的值显示出来。是因为我调用了一个float,它只接受内存中最近的一个float吗

#include <stdio.h> 

int main()
{
    int a=3/2;
    printf("The value of 3/2 is : %d\n", a );

    float b=3.0/2;
    printf("The value of 3/2 is : %f\n", b );

    float c=7.0/2;                                  <-------
    printf("The value of 3/2 is : %f\n", c );

    int d=3.0/2;
    printf("The value of 3/2 is : %f\n", d );       <-------

    return 0;
}

与格式说明符指示的类型不匹配的参数会产生未定义的行为(例如,参见):

。。。如果任何参数不是该类型 由相应的转换说明符预期,或者如果存在 参数少于格式要求的参数,行为未定义

未定义的行为是未定义的;它可能会崩溃,可能什么也不打印,任何东西,甚至是看起来正确的东西。例如,在以下方面给出未定义行为的定义:

3.4.3(1)未定义的行为

使用不可移植或错误的程序结构或 本国际标准没有规定的错误数据 需求注释可能的未定义行为包括忽略 结果完全不可预测的情况,在 以文档化的方式执行翻译或程序 环境(无论是否发布诊断报告 消息),以终止翻译或执行(随发布) 诊断信息的定义)


printf
函数访问与指定格式匹配的内存量;如果您没有提供足够的信息,则行为是未定义的,介于编译器依赖和随机之间


它可能会读取给定地址之后的任何内存,并且由于浮点位于不同的字节边界上,因此会获取其他变量所在的位置。另一个编译器或轻微的代码更改将给出不同的结果;分析“未定义的行为”是没有意义的。

未定义的行为是未定义的。我猜您是在x64上platform@M.M:您的意思是因为在64位上,浮点值通过SSE寄存器传入,
3.5
的值仍然在该寄存器中吗?
The value of 3/2 is : 1
The value of 3/2 is : 1.500000
The value of 3/2 is : 3.500000
The value of 3/2 is : 3.500000