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
和*
的意義是什麼?請解釋下列內容的差異
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
和*
的意義是什麼?請解釋下列內容的差異
%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
[...]如果有任何參數是 不正確鍵入相應的轉換規範,行爲是未定義的 。 [...]
%x
在printf
中指定用於以十六進制符號打印無符號整數參數。這就是爲什麼你看到所有打印'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
不作不斷,只爲只讀定義的東西。
執行定義?你能引用一些東西嗎? –
@SouravGhosh感謝提醒,這是UB,我只是在考慮轉換,而不是printf的期望。 – fluter
好的,但是,什麼是「未定義的行爲」? :) –
Hope幫助http://www.tutorialspoint.com/c_standard_library/c_function_printf.htm – hemanjosko
把你的編譯器的警告變成最大值,你會看到這段代碼有什麼問題。 –
帶指針的演員是錯誤的。這是主要的區別。用'-Wall'選項編譯你的代碼。海灣合作委員會將爲您提供所有信息。 – LPs