0

我在某处读到 printf 采用程序前两个赋值的值。可以给出任意数量的 printf。它们都只取前两个值。如果程序中给出了更多的赋值,那么 printf 将采用垃圾值。

我不这么认为,但它是在许多网站上给出的,所以只需要确认它

例如,如果您进行简单的 Google 搜索,"printf takes first two assignment as input"就会发现有一些网站有示例面试问题/答案,例如:

预测以下输出或错误:

main()
{
    int i=400,j=300;
    printf("%d..%d");
}

答案:400..300

解释: printf 取程序前两个赋值的值。可以给出任意数量的 printf。

它们都只取前两个值。如果程序中给出了更多的赋值,那么 printf 将采用垃圾值。

这是正确的真实行为吗?还是依赖于实现?

你可以找到这样的问答场所,例如:
这个拼图网站
这个面试问题文档

4

2 回答 2

5

不,这绝对不是真的。

有关上下文,请阅读 C11 7.21.6.3/2:

printf函数等效于在 printffprintf的参数stdout之前插入参数。

因此,根据标准,C11 7.21.6.1/2:

fprintf函数将输出写入 stream 指向的流,在 format 指向的字符串的控制下,该字符串指定后续参数如何转换为输出。如果格式的参数不足,则行为未定义。[...]

(强调我的)

可能发生的情况是堆栈中的值可能会在printf()调用时被拉出。再说一次,由于行为是未定义的,任何事情都可能发生,从打印垃圾值或程序崩溃,到在邻居的并行打印机上打印出蛋糕图片(真的,任何事情)。

除非您的特定实现(特定的CPU 架构,具有特定的编译器和可能的特定操作系统)将特定情况记录为您可以做的事情,否则不要这样做

您的拼图网站的“拼图”主要是未定义行为和关于实现定义行为的错误假设的组合。有些例子是正确的,但考虑到它大多是坏的,我只是假装我从未见过它。随机的互联网站点往往是学习编程的不好资源,尤其是 C。如果你想学习 C,你应该得到一本关于 C 编程的合适的书(可以在此处找到列表)。

于 2013-01-15T18:36:04.783 回答
2

这是正确的真实行为吗?还是依赖于实现?

那是未定义的行为。根本无法保证会发生什么。

省略号...机制的可能实现C可能会导致您在问题中显示的特定评估,尽管它也取决于编译器和优化器。

于 2013-01-15T18:36:21.987 回答