2016-04-28 67 views
-7
printf("%x\n",(const uint8_t *)0x0D); 
printf("%x\n",(const uint8_t)0x0D); 
printf("%x\n",(uint8_t *)0x0D); 
printf("%x\n",0x0D); 

他們都給我D。這裏const*的意義是什麼?請解釋下列內容的差異

+0

Hope幫助http://www.tutorialspoint.com/c_standard_library/c_function_printf.htm – hemanjosko

+0

把你的編譯器的警告變成最大值,你會看到這段代碼有什麼問題。 –

+1

帶指針的演員是錯誤的。這是主要的區別。用'-Wall'選項編譯你的代碼。海灣合作委員會將爲您提供所有信息。 – LPs

回答

1

%x格式說明符專家參數是類型unsigned int

在你的情況,

printf("%x\n",(const uint8_t)0x0D); 
printf("%x\n",0x0D); 

參數將被提升(默認提升規則)相匹配的類型,但在

printf("%x\n",(const uint8_t *)0x0D); //supplying a pointer 
printf("%x\n",(uint8_t *)0x0D);  //supplying a pointer 

情況下,你會調用undefined behavior,按C11,章節§7.21.6.1

[...]如果有任何參數是 不正確鍵入相應的轉換規範,行爲是未定義的 。 [...]

+0

*參數將被提升(默認促銷規則)以匹配類型*這是不正確的。在第一個printf中,常量在轉換後被提升爲int,與指定符「x」不匹配,而在第二個常量的類型已經是int,也不符合'x'。你引用的標準部分解釋了爲什麼這些例子是ub。 – 2501

+0

@ 2501第一個是無符號類型,爲什麼不行? – fluter

+0

@fluter因爲它被提升爲int,使用默認參數促銷。 – 2501

0

%xprintf中指定用於以十六進制符號打印無符號整數參數。這就是爲什麼你看到所有打印'D'。但只有第四種形式是正確的。

printf("%x\n",(const uint8_t *)0x0D); // undefined behavior, converting integer constant to a pointer 
printf("%x\n",(const uint8_t)0x0D); // ok, but not necessary 
printf("%x\n",(uint8_t *)0x0D); // undefined behavior 
printf("%x\n",0x0D); // ok 

注意函數不需要在任何情況下恆定的,所以const根本沒用,注意用C const不作不斷,只爲只讀定義的東西。

+1

執行定義?你能引用一些東西嗎? –

+0

@SouravGhosh感謝提醒,這是UB,我只是在考慮轉換,而不是printf的期望。 – fluter

+0

好的,但是,什麼是「未定義的行爲」? :) –