请解释下面printfs的区别

时间:2016-04-28 08:30:22

标签: c printf format-specifiers

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*的重要性是什么?

2 个答案:

答案 0 :(得分: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

根据C11,您将调用undefined behavior,章节§7.21.6.1

  

[...]如果有任何论据   不是相应转换规范的正确类型,行为是   未定义。 [...]

答案 1 :(得分:0)

%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不会保持不变,它只将内容定义为只读。