为什么以及如何选择匹配的参数?

时间:2014-10-22 14:49:45

标签: c

有人问过我,为什么这段代码产生一个随机数:

double a = 75.0;
printf("%d\n", a);

我认为原因是double的4个字节被解释为整数,但每次运行程序时打印的值都不同。所以我开始尝试更多的东西,发现这个:

printf("%d\n", 75.0, 6);

实际打印出6号。所以我认为编译器试图修复参数以便它们匹配格式字符串,但后来我尝试了这个:

const char *formats[] = { "%d %.1f\n", "%.1f %d\n" };
int whichFormat = 0;
scanf("%d", &whichFormat);
printf(formats[whichFormat&1], 2.5, 7, 1.2);

格式化字符串现在在编译时甚至都不知道,但它仍然以某种方式设法将参数类型与格式化字符串匹配,根据输入打印7 2.52.5 7。最后一个值(1.2)没有打印出来。

所有这些都可以在声称使用GNU GCC 4.8.1的compileonline.com上复制。

这里发生了什么?

1 个答案:

答案 0 :(得分:5)

未定义的行为正在进行中。

这种行为是不明确的,因此很难推理,而且做实验也有点无意义,因为不能保证行为保持相同(即明确定义)相同的输入。毕竟,这种行为是未定义的。

例如,第一个例子可能从一个寄存器读取一个预期的整数参数,而实际的浮点参数在另一个寄存器中。我并不是说这是在任何已知机器上发生的事情,但它可能就像那样。