当我运行此代码时, 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
答案 0 :(得分:2)
与格式说明符指示的类型不匹配的参数会产生未定义的行为(例如,参见cppreference/printf):
...如果任何参数不是类型 由相应的转换说明符预期,或者如果有的话 参数少于格式所需的参数,行为未定义。
未定义的行为未定义;它可能崩溃,它可能打印出任何东西,任何东西,甚至看起来正确的东西。例如,在此online c draft standard:
中提供未定义行为的定义3.4.3(1)未定义的行为
行为,使用不可移植或错误的程序构造或 错误的数据,本国际标准没有规定 要求注意可能的未定义行为包括忽略 情况完全不可预测的结果,在表现期间 以文件化的方式执行翻译或程序执行 环境(有或没有发布诊断 消息),终止翻译或执行(与发行 诊断信息)。
答案 1 :(得分:2)
printf
函数访问与您指定的格式匹配的内存量;如果你没有提供足够的,行为未定义,并且介于编译器相关和随机之间。
可能它会读取给定地址之后的任何内存,并且因为浮点数位于不同的字节边界,所以获取其他变量所在的位置。另一个编译器或轻微的代码更改会给出不同的东西分析“未定义的行为”是没有意义的。