![](/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.