是真的printf将前两个赋值作为输入

时间:2013-01-15 16:56:12

标签: c

我在那里读到了 printf获取程序前两个赋值的值。任何 可以给出printf的数量。所有这些都只占前两个 值。如果在程序中给出更多的赋值,则printf 将采取垃圾值。

我不这么认为,但它是在很多网站上发布的,所以只需要确认一下

例如,如果您对"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

2 个答案:

答案 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机制的可能实现可能导致您在问题中显示的特定评估,尽管它还取决于编译器和优化器。