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

时间:2017-06-09 23:24:49

标签: c floating-point format printf specifier

当我运行此代码时, D 的输出显示为 C 的值。是因为我要求一个浮点数,它只需要最新的浮点数在内存中?

#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;
}
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

2 个答案:

答案 0 :(得分:2)

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

  

...如果任何参数不是类型   由相应的转换说明符预期,或者如果有的话   参数少于格式所需的参数,行为未定义。

未定义的行为未定义;它可能崩溃,它可能打印出任何东西,任何东西,甚至看起来正确的东西。例如,在此online c draft standard

中提供未定义行为的定义
  

3.4.3(1)未定义的行为

     

行为,使用不可移植或错误的程序构造或   错误的数据,本国际标准没有规定   要求注意可能的未定义行为包括忽略   情况完全不可预测的结果,在表现期间   以文件化的方式执行翻译或程序执行   环境(有或没有发布诊断   消息),终止翻译或执行(与发行   诊断信息)。

答案 1 :(得分:2)

printf函数访问与您指定的格式匹配的内存量;如果你没有提供足够的,行为未定义,并且介于编译器相关和随机之间。

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