C printf():何时写入%n?
考虑以下代码:C printf():何时写入%n?,c,printf,string-formatting,C,Printf,String Formatting,考虑以下代码: #include <stdio.h> int main() { int i = 0; printf("hello%n%d\n", &i, i); } #包括 int main(){ int i=0; printf(“你好%n%d\n”、&i、i); } 为什么它打印的是hello0,而不是hello5?%n未写入。它的意思是“没有印刷。” : 换句话说,printf返回后,i将包含值5。但直到printf返回——这就是为什么您看到的是0而不是5。
#include <stdio.h>
int main() {
int i = 0;
printf("hello%n%d\n", &i, i);
}
#包括
int main(){
int i=0;
printf(“你好%n%d\n”、&i、i);
}
为什么它打印的是
hello0
,而不是hello5
?%n未写入。它的意思是“没有印刷。”
:
换句话说,printf返回后,
i
将包含值5。但直到printf返回——这就是为什么您看到的是0而不是5。调用函数时,函数参数会复制到被调用函数的范围中。由于i
是0
,因此值0
被复制到printf
的范围内,并用于在%d
转换中打印
此外,值&i
被复制到函数的作用域中,函数使用该值用迄今为止的输出字节数填充该地址处的变量。因此,在函数调用返回后,可以检查i
以找到该值
您使用相同的变量为
%d
参数生成值,并为%n
参数生成地址,这完全是巧合。事实上,最后一个i
参数确实有点误导,因为这里重要的不是i
的身份,而是它的值。您还可以在那里放置一个文本0
。(从技术上讲,表达式i
进行“左值转换”,这只是一种花哨的说法,表示您不关心变量,只关心值。)为什么它应该打印5??您的整数值是0,这就是您所指的printf中的InsideArgument将从右向左执行。也基于编译器。好的,%n说明符应该将到目前为止写入的字节数写入整数i,因此我应该包含值5(因为“hello”包含5个字符)。对于任何考虑过函数、参数传递和引用语义的人来说,这个问题可能是显而易见的,但对于一个从未经历过这种情况的人来说,这似乎是一个完全合理的问题。啊,该死,我错过了。谢谢因此,当printf解析格式字符串时,会立即写入%n?@delta242:否,或者类似。如果“立即”是指“在解析过程中”。一旦到达输出字符串的那一部分,它就会被写入。在您的情况下,它应该写5左右的值。您可以稍后通过打印原始i
进行检查。字符串不是经过“解析”的,而是经过“处理”的,它是一个简单的从左到右的单过程。是的,我知道,之后变量I包含值5。我只需要在解析格式字符串时写入的“功能”。@delta242:您的意思是要在相同的printf调用中打印运行计数吗?我不确定这是否可能。。。您需要另一个解引用转换说明符,我认为没有。(虽然可能有供应商扩展。)我需要它来利用格式字符串,这是大学的一门课程。I
在printf
将5写入其传递的地址时将包含5,而该地址在printf
返回之前,因此这不是打印“0”而不是“5”的原因。打印“0”的原因是,0是在准备调用printf
时计算参数i
的结果。
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.