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

ica*_*der 0 c

我在某处读到printf获取程序前两个赋值的值.可以给出任意数量的printf.所有这些都只采用前两个值.如果在程序中给出更多的赋值,那么printf将获取垃圾值.

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

例如,如果您进行简单的Google搜索,"printf takes first two assignment as input"那么有些网站会提供样本面试问题/答案,例如:

预测以下输出或错误:

main()
{
    int i=400,j=300;
    printf("%d..%d");
}
Run Code Online (Sandbox Code Playgroud)

答案:400..300

说明:printf获取程序前两个赋值的值.可以给出任意数量的printf.

所有这些都只采用前两个值.如果在程序中给出更多的赋值,那么printf将获取垃圾值.

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

你可以找到这样的问答地点:
这个拼图网站
这个面试问题文档

net*_*der 5

不,这绝对不是真的.

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

printf函数等同于printf fprintf参数stdout之前插入的参数.

所以,从标准来看,C11 7.21.6.1/2:

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

(强调我的)

可能发生的是,堆栈中的值可能会被printf()调用.然后,由于行为未定义,任何事情都可能发生,从打印垃圾值或程序崩溃,到在邻居的并行打印机上打印蛋糕图片(实际上,任何事情).

除非您的具体实现(特定的 CPU架构,具有特定的编译器和可能的特定操作系统)将特定案例记录为您可以执行的操作,否则请勿执行此操作.

您的拼图网站的"谜题"主要是未定义的行为和关于实现定义的行为的错误假设的组合.一些例子是正确的,但考虑到它主要是坏的,我只是假装我从未见过它.随机互联网网站往往是学习编程的不良资源,特别是C.如果你想学习C,你应该得到一本关于C编程的正确书籍(这里可以找到一个列表).