为什么这个printf语句不会产生书中示例中显示的输出?

时间:2011-04-10 08:30:16

标签: c printf

int j=5,k=9;
printf("%d...%d");

这个问题出现在一本书中。 输出给出:5 9 但是当我尝试这个时,我得到了:垃圾值,请向我解释一下。 书中的解释说,printf取得了程序前两个赋值的值

4 个答案:

答案 0 :(得分:10)

您的图书作者依赖愚蠢的行为。 (我不知道它是undefined还是implementation defined还是just plain stupid。)

当调用j时,他们依赖于堆栈分配的kprintf(3)变量。由于printf(3)将使用其格式字符串来确定要读取多少对象的类型,因此它会神奇地< / em>将位于堆栈上的jk变量解释为参数printf(3),就好像它们已经传递给它一样有意

这太依赖于“幕后如何运作”的魔力。除非这个代码块被“这段代码可能会显示给你......”和“永远不做这个愚蠢的事情......”所包围,否则这本书可能不值得再读了。

答案 1 :(得分:3)

首先,如果你写

int j=5,k=9;
printf("%d...%d", j, k);

你将得到5 9。

现在,printf是一个可以获取可变数量参数的函数,它解析String,它始终是第一个参数,并决定从给定参数中放置值的位置。这意味着编译器没有强制执行给函数的参数,这就是为什么你没有得到任何错误。

如果参数在函数调用中被推送到堆栈(大多数时候都是这种情况),那么printf会看到%d并将下一个int作为数字放在堆栈上(和所以,因为除了基本字符串之外你没有分配参数,堆栈上的数据与函数调用无关(它是相关的,但它不是你想要的:))

答案 2 :(得分:1)

拿起另一本书printf(“%d ...%d”);没有任何意义。您必须提供两个整数参数来替换格式字符串中的%d。

答案 3 :(得分:0)

尝试:

int j=5,k=9;
printf("%d %d", j, k);