我用printf
#include <stdio.h>
int main()
{
double foo = 2.54f;
printf("-> %d\n", foo);
}
运行几次之后输出:
- &GT; 1180400440
- &GT; 1754655672
- &GT; 1596232744
- &GT; -905631720
- &GT; 202675976
- &GT; -1580281720
- &GT; 1020283160
- &GT; 929827960
我的问题是,为什么每次运行程序时都会输出不同的数字?
答案 0 :(得分:5)
因为在您的平台上,double
和int
以不同方式传递给函数。通常,double
在浮点寄存器中传递,而int
在通用寄存器中传递。 (当然,达到某种限制;最终你会用完寄存器,如果参数太多,剩下的就会在堆栈上传递。)
当您告诉printf
期待int
时,它会查找int
预计会找到int
的位置。但是GPR没有被设置为任何特定值,因为当你调用printf
时,你用double
调用它,它被放入浮点寄存器。
你真的不需要知道,虽然它可能很有趣。实际上未定义的行为(UB)是关于您提供的参数类型的printf
,并且大多数编译器会警告您(至少如果您提供-Wall
命令 - 行选项或等价物)。 UB意味着可能发生任何事情,包括例如程序提前终止或使用完全随机数据。因此,请确保您要求编译器向您发出警告,并确保修复它们。
答案 1 :(得分:1)
该错误使您的程序调用未定义的行为。
请参阅此C缺陷报告问题:
http://www.open-std.org/jtc1/sc22/wg14/docs/rr/dr_083.html
未定义的行为意味着一切都会发生。