![](/img/trans.png)
[英]how Backslash \ joins printf strings when written on separate lines in C?
[英]printf(): When is %n written?
请考虑以下代码:
#include <stdio.h>
int main() {
int i = 0;
printf("hello%n%d\n", &i, i);
}
为什么打印hello0
而不是hello5
?
调用函数时,函数参数将复制到被调用函数的范围内。 由于i
为0
,因此将值0
复制到printf
的范围内并用于在%d
转换中进行打印。
此外,值&i
被复制到函数的范围内,并且函数使用该值来填充该地址处的变量以及到目前为止的输出字节数。 因此,在函数调用返回后,您可以检查i
以查找该值。
您使用相同的变量既为%d
参数生成值又为%n
参数生成地址这一事实纯属巧合。 事实上,过去的i
的说法实在是有点误导,因为它不是身份i
是这里的问题,但只有它的价值 。 你可能会在那里放一个字面值0
。 (从技术上讲,表达式i
经历了“左值转换”,这只是一种说法,你不关心变量,只关注价值。)
%n未写入。 这意味着“什么都不打印”。
从精细手册 :
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。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.