-1

当我运行此代码时,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
4

2 回答 2

2

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

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

未定义的行为是未定义的;它可能会崩溃,它可能不会打印出任何东西,甚至是看起来正确的东西。例如,在此在线 c 草案标准中赋予未定义行为的定义:

3.4.3 (1) 未定义行为

行为,在使用不可移植或错误程序结构或错误数据时,本国际标准没有要求环境(有或没有诊断消息的发布)终止翻译或执行(有诊断消息的发布)。

于 2017-06-09T23:29:09.487 回答
2

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

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

于 2017-06-09T23:30:06.730 回答