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