int j=5,k=9;
printf("%d...%d");
这个问题出现在一本书中。 输出给出:5 9 但是当我尝试这个时,我得到了:垃圾值,请向我解释一下。 书中的解释说,printf取得了程序前两个赋值的值
答案 0 :(得分:10)
您的图书作者依赖愚蠢的行为。 (我不知道它是undefined
还是implementation defined
还是just plain stupid
。)
当调用j
时,他们依赖于堆栈分配的k
和printf(3)
变量。由于printf(3)
将使用其格式字符串来确定要读取多少对象的类型,因此它会神奇地< / em>将位于堆栈上的j
和k
变量解释为参数到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);