1

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

4

2 回答 2

5

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

§ 7.21.6fprintf功能

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

于 2013-08-01T10:44:39.240 回答
0

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

printf语句将重新使用变量来填写其所有 % fmt 定义。它看起来像t被忽略并被t.a重新t.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
     }
于 2013-08-02T07:10:20.267 回答