如果我们将打印结构变量本身,那么程序的行为是什么

时间:2013-08-01 10:39:26

标签: c structure printf output

我正在检查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标准中给出的行为将是未定义的。

2 个答案:

答案 0 :(得分:5)

是的,这是一种未定义的行为。以下是该标准的相应部分:

§7.21.6fprintf函数

  

如果转换规范无效,则行为未定义。 如果任何参数不是相应转换规范的正确类型,则行为未定义。

答案 1 :(得分:0)

我在Eclipse / Microsoft C编译器上运行了以下代码并复制了您的结果而没有引用struct t,其他编译器的行为可能不同。

printf语句将重用变量来填写所有%fmt定义。看起来t被忽略,t.at.b被重复使用。这就是打印0和0.0000的原因,因为t.at.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
     }