在printf函数格式标签高于args将会发生什么?

时间:2018-04-20 03:30:22

标签: c printf

由同事作为一个谜题,我无法弄清楚这个C程序实际上是如何编译和运行的。

int main()  
{  

    int a=5;  
    printf("%d %d %d %d %d %d",a++,++a,a++,--a,++a);


return 0;  
}

2 个答案:

答案 0 :(得分:0)

这在ISO标准中有所涉及。 C11 7.21.6.1 The fprintf function /2状态非常明确,printf()只是fprintf(stdout)的简写:

  

fprintf函数在stream指向的字符串的控制下将输出写入format指向的流,该字符串指定后续参数如何转换为输出。 如果格式的参数不足,则行为未定义。 如果参数保留时格式已用尽,则会评估多余的参数(一如既往),否则将被忽略

所以会发生什么,嗯,只是任何东西!毕竟,那是什么" undefined"装置

您需要记住,任何甚至包括尽管您尽最大努力它仍然有效的可能性。由于它未定义,编译器甚至可以自由地假设您不知道自己想要什么,只需从字符串中删除最终格式说明符即可。它还可以格式化您的硬盘并通过您的音响系统播放derisive_laughter.mp3文件: - )

答案 1 :(得分:-1)

虽然C语言规范未定义行为,但鉴于C的最常见实现,我们可以猜测会发生什么。

printf可变参数函数,这意味着它所采用的参数数量可能会有所不同。通常,参数的数量由格式字符串决定,只要格式字符串需要,函数的实现将继续从栈中获取参数。

由于有6个%d且只有5个参数,因此该函数将从堆栈中获取一个额外的4字节值,将其解释为整数,并将其打印出来。

当然,这一切都不能保证。这个程序已经破坏了规则,鼻子恶魔是有效的可能性。但我认为基于部分堆栈获取垃圾输出是合理的,可能的结果。