由同事作为一个谜题,我无法弄清楚这个C程序实际上是如何编译和运行的。
int main()
{
int a=5;
printf("%d %d %d %d %d %d",a++,++a,a++,--a,++a);
return 0;
}
答案 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字节值,将其解释为整数,并将其打印出来。
当然,这一切都不能保证。这个程序已经破坏了规则,鼻子恶魔是有效的可能性。但我认为基于部分堆栈获取垃圾输出是合理的,可能的结果。