我正在检查C代码的一些输出。代码是:
main()
{
struct temp
{
int a;
float b;
}t;
t.a = 5;
t.b = 2.0;
printf( "%d %d %f" , t, t.a ,t.b); // printing 5 0 0.0000000 ...why??
printf( "%d %f %d" , t.a, t.b ,t); // printing 5 2.000000 5
}
这个程序的输出是什么?打印什么“t”? 如果行为未定义,那么在某个C标准中给出的行为将是未定义的。
答案 0 :(得分:5)
是的,这是一种未定义的行为。以下是该标准的相应部分:
fprintf
函数如果转换规范无效,则行为未定义。 如果任何参数不是相应转换规范的正确类型,则行为未定义。
答案 1 :(得分:0)
我在Eclipse / Microsoft C编译器上运行了以下代码并复制了您的结果而没有引用struct t
,其他编译器的行为可能不同。
printf
语句将重用变量来填写所有%fmt定义。看起来t
被忽略,t.a
和t.b
被重复使用。这就是打印0和0.0000的原因,因为t.a
和t.b
与不正确的fmt定义配对。
根据先前的答案,当printf
规范不正确时,其结果未定义!
#include <stdio.h>
void main()
{
struct temp
{
int a;
float b;
} t;
t.a = 5;
t.b = 2.0;
printf( "\n%d %d %f" , t.a ,t.b, t.a); // printing 5 0 0.0000000
printf( "\n%d %f %d" , t.a, t.b ,t.a); // printing 5 2.000000 5
}