printf():%n写什么时候?

时间:2017-11-10 14:43:50

标签: c printf string-formatting

请考虑以下代码:

#include <stdio.h>

int main() {
  int i = 0;
  printf("hello%n%d\n", &i, i);
}

为什么打印hello0而非hello5

2 个答案:

答案 0 :(得分:5)

调用函数时,函数参数复制到被调用函数的范围内。由于i0,因此值0会复制到printf的范围内,并用于在%d转化中打印。

此外,值&i被复制到函数的作用域中,函数使用该值来填充该地址的变量,其中包含到目前为止的输出字节数。因此,在函数调用返回后,您可以检查i以找到该值。

您使用相同的变量来生成%d参数的值并为%n参数生成地址这一事实纯属巧合。事实上,最后一个i参数实际上有点误导,因为i的身份不是重要的,而只是。你可能还有一个文字0。 (从技术上讲,表达式i经历了“左值转换”,这只是一种说法,你不关心变量,只关注价值。)

答案 1 :(得分:1)

%n未写入。这意味着没有任何印刷品。&#34;

From the fine manual

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的原因。