我在某处读到Printf取程序前两次赋值的值。任何可以给出打印的数量。它们都只取前两个值。如果程序中给出了更多的赋值,则打印将接受垃圾值。
我不这么认为,但很多网站都给出了,所以我需要确认一下
例如,如果你在谷歌上搜索"printf takes first two assignment as input"
,有一些网站有面试问题/答案的样本,如:
预测以下情况的输出或错误:
main()
{
int i=400,j=300;
printf("%d..%d");
}
答:400 . . 300
说明:printf取程序前两次赋值的值。可以给出任意数量的printf。
它们都只取前两个值。如果更多的程序中给定的赋值,那么printf将获取垃圾值。
这是正确的真实行为吗?还是依赖于实现?
你可以在以下地方找到这样的问题:
这个拼图网站
还有这个面试问题doc
不,这绝对不是真的。
有关上下文,请参阅C11 7.21.6.3/2:
参数之前
printf
函数与fprintf
函数等效,中间插入了参数stdout
在printf.
所以,从标准C11 7.21.6.1/2:
fprintf
函数将输出写到受控流所指向的流中指定后续参数的格式所指向的字符串的转换为输出。如果该格式没有足够的参数,则行为为未定义的。[…]
(强调我的)
可能发生的情况是,printf()
调用时可能会从堆栈中取出值。然后,由于行为是未定义的,任何事情都可能发生,从打印垃圾值或程序崩溃,到在邻居的并行打印机上打印出蛋糕图片(实际上,任何事情)。
除非你的特定的实现(一个特定的 CPU架构,一个特定的编译器,可能还有一个特定的操作系统)记录了特定的情况是你可以做的事情,不要这样做。
谜题网站的"谜题"大多是未定义行为和关于实现定义行为的不正确假设的组合。有些例子是正确的,但考虑到它大多是坏的,我就假装我从来没有看到过它。对于学习编程来说,随机的网站往往不是一个好的资源,尤其是C。如果你想学习C,你应该找一本关于C编程的合适的书(一个列表可以在这里找到)。
这是正确的真实行为吗?还是依赖于实现?
这是未定义的行为。谁也不能保证会发生什么。
省略号...
机制在C
中的可能实现可能导致您在问题中显示的特定求值,尽管它也取决于编译器和优化器。