我不这么认为,但它是在很多网站上发布的,所以只需要确认一下
例如,如果您对"printf takes first two assignment as input"
进行简单的Google搜索,则会有一些网站提供样本面试问题/答案,例如:
预测以下输出或错误:
main()
{
int i=400,j=300;
printf("%d..%d");
}
答案:400..300
说明:printf获取程序前两个赋值的值。可以给出任意数量的printf。
所有这些都只占用前两个值。如果更多的话 在程序中给出的赋值,然后printf将获取垃圾值。
这是正确的真实行为吗?还是依赖于实现?
你可以找到这样的Q& A地方,如:
this puzzle site
和this interview question doc
答案 0 :(得分:5)
不,这绝对不是真的。
有关上下文,请阅读C11 7.21.6.3/2:
printf
函数等同于fprintf
,其中插入了参数stdout
在printf的参数之前。
所以,从标准,C11 7.21.6.1/2:
fprintf
函数将输出写入流控制的流所指向的流 格式指向的字符串,指定后续参数的方式 转换为输出。 如果格式的参数不足,则行为为 未定义。 [...]
(强调我的)
可能发生的事情是,在调用时,堆栈中的值可能会被printf()
拉出。然后,由于行为未定义,任何事情都可能发生,从打印垃圾值或程序崩溃,到在邻居的并行打印机上打印蛋糕图片(真的,anything)。
除非您的特定实施(特定 CPU架构,特定编译器,可能还有特定操作系统)将特定案例记录为您可以做的事情,不要这样做。
您的拼图网站的“谜题”主要是未定义行为和有关实现定义行为的错误假设的组合。一些例子是正确的,但考虑到它主要是坏的,我只是假装我从未见过它。随机互联网网站往往是学习编程的不良资源,特别是C.如果你想学习C,你应该得到一本关于C编程的正确书籍(列表can be found here)。
答案 1 :(得分:2)
这是正确的真实行为吗?还是依赖于实现?
这是未定义的行为。无法保证会发生什么。
...
中省略号C
机制的可能实现可能导致您在问题中显示的特定评估,尽管它还取决于编译器和优化器。