请考虑以下代码:
#include <stdio.h>
int main() {
int i = 0;
printf("hello%n%d\n", &i, i);
}
为什么打印hello0
而非hello5
?
答案 0 :(得分:5)
调用函数时,函数参数复制到被调用函数的范围内。由于i
为0
,因此值0
会复制到printf
的范围内,并用于在%d
转化中打印。
此外,值&i
被复制到函数的作用域中,函数使用该值来填充该地址的变量,其中包含到目前为止的输出字节数。因此,在函数调用返回后,您可以检查i
以找到该值。
您使用相同的变量来生成%d
参数的值并为%n
参数生成地址这一事实纯属巧合。事实上,最后一个i
参数实际上有点误导,因为i
的身份不是重要的,而只是值。你可能还有一个文字0
。 (从技术上讲,表达式i
经历了“左值转换”,这只是一种说法,你不关心变量,只关注价值。)
答案 1 :(得分:1)
%n未写入。这意味着没有任何印刷品。&#34;
Nothing printed.
The corresponding argument must be a pointer to a signed int.
The number of characters written so far is stored in the pointed location.
换句话说,在printf返回后,i
将包含值5.但是直到printf返回 - 这就是你看到0而不是5的原因。