2017-02-12 90 views
-2
#include<stdio.h> 

int main() 

{ 
    char *p; 
    p="%d\n"; 
    p++; 
    p++; 
    printf(p-2, 400); 
    return 0; 
} 

當我在代碼上面運行時,輸出400.但是爲什麼400?以下C程序的輸出是什麼

+1

你還會期望得到什麼,爲什麼? –

+0

實際上我並沒有更深入地意識到printf()函數的語法。所以我不明白我的代碼中發生了什麼。 –

回答

2

printf()的第一個參數是格式字符串。變量p是一個指向字符數組的指針,這也是字符串表示的方式。

當p被分配一個字符串"%d\n"它說格式化一個整數來打印它的值,然後打印回車符。

由於p是字符指針p++表示將指針向前移動1個字符。這會執行兩次以將p向前移動2個字符,因此它指向回車符的開頭。 p-2說做指針數學給char* 2個字符在p點前面。

這是回車字符串%d的開頭。這成爲格式字符串,並且第二參數400替代%d並打印其自身,然後回車。

3

首先爲p分配格式化字符串。然後它減少兩倍。最後,它的值減2傳遞給帶有附加參數400的printf。

從最新值p中減去2將其移回原始格式化字符串。因此,printf輸出值爲400.

+0

謝謝@Zbynek。我明白了。 –

1

您聲明瞭一個指向字符串的指針,併爲其指定值"%d\n"。這個指針在內存中保存一個地址。

例如,讓我們說的好聽點,以解決6時加兩到它(這你不應該做你,你總是知道你的指針都指向)你地址更改爲8

現在當你做printf你用當前的地址p指向(8)減去2代替它,它是6.