我在某处读到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将获取垃圾值.
这是正确的真实行为吗?还是依赖于实现?
不,这绝对不是真的.
有关上下文,请阅读C11 7.21.6.3/2:
该
printf函数等同于printffprintf参数stdout之前插入的参数.
所以,从标准来看,C11 7.21.6.1/2:
该
fprintf函数在format指向的字符串的控制下将输出写入stream指向的流,该格式指定后续参数如何转换为输出.如果格式的参数不足,则行为未定义.[...]
(强调我的)
可能发生的是,堆栈中的值可能会被printf()调用.然后,由于行为未定义,任何事情都可能发生,从打印垃圾值或程序崩溃,到在邻居的并行打印机上打印蛋糕图片(实际上,任何事情).
除非您的具体实现(特定的 CPU架构,具有特定的编译器和可能的特定操作系统)将特定案例记录为您可以执行的操作,否则请勿执行此操作.
您的拼图网站的"谜题"主要是未定义的行为和关于实现定义的行为的错误假设的组合.一些例子是正确的,但考虑到它主要是坏的,我只是假装我从未见过它.随机互联网网站往往是学习编程的不良资源,特别是C.如果你想学习C,你应该得到一本关于C编程的正确书籍(这里可以找到一个列表).