2016-04-28 45 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

好的,但是,什么是“未定义的行为”? :) –