2017-06-20 201 views
0
#include <stdio.h> 

    int main(void) 
    { 

     int i=10; 
     printf("%p",i); 
     return 0; 
    } 

輸出: -林困惑關於%P符

0xa 

%P - 我讀%P是用來打印在printf的指針,但在這裏我是一個整數,也沒有指針聲明如何「0xa」得到輸出。

+0

輸入錯誤,輸出錯誤。一般來說,'printf'只打印你輸入的內容。在這裏你把一個整數,並打印這個整數。由於'%p'不是適用於整數的格式說明符,因此您也有未定義的行爲 – Gerhardh

+0

順便說一句,恕我直言,問題沒有錯。寫得很好,也是一個可編輯的例子。 – Bathsheba

回答

4

您的代碼的行爲是undefined,因爲%p不適用於int類型的適當格式說明符。

允許編譯器做任何東西,其中包括優化您的代碼到int main(){}

2

從技術上講,這是未定義的行爲,因爲%pint的錯誤格式說明符。

但是,如果你的平臺是32位,然後%p通常歸結爲印刷在大多數實現十六進制所提供的值,因此printf("%p", 10);通常會打印在這些實現0xA0x0000000A

無論如何,不​​要使用不匹配的格式說明符,因爲即使它看起來工作,它也會導致undefined behaviour

+0

合理化UB是一種危險的藝術。恕我直言,需要在這裏採取更多的照顧。例如。 int可能是32位平臺上的16位。然後怎樣呢?但是你確實描述了輸出,所以或許你的回答比我的更有幫助。有一個upvote。 – Bathsheba

+0

@Bathsheba是'int'可能是16位,但我不知道這樣的實現。但無論如何,我寫了_usually_。 –

+0

我們的老朋友Turbo C++有16位整數,許多學校似乎都使用它。 – Bathsheba